Spring屬性編輯器
1 屬性編輯器
對於屬性編輯器我們一般分為Core Context的使用和MVC的使用兩種
Core Context的使用
Spring Core Context其實也使用ConversionService,但是是非強制的。
Spring在讀取xml配置檔案的時候,因為xml檔案實際上是一個文字檔案,所有值的設定都是String,這個時候如果給bean的複雜型別屬性設定值,它會用到PropertyEditor或ConversionService。
比如下面例子中的color屬性是Color型別,這時就會利用到PropertyEditor和ConversionService:
<bean id="someBean" class="a.b.c.SomeBean"> <property name="color" value="red"/> </bean>
MVC的使用
Spring MVC對於conversionService的使用比較特殊,它自己會註冊一個名字叫做mvcConversionService型別為DefaultFormattingConversionService的Bean(程式碼在WebMvcConfigurationSupport#mvcConversionService)。因此會存在以下陷阱:
如果Core Context中也定義了一個ConversionService,那麼在MVC環境下,會有兩個ConversionService的Bean。
針對Core Context的ConversionService做的Customize如FormatterRegistrar、ConverterRegistry、FormatterRegistry、ConversionServiceFactoryBean、FormattingConversionServiceFactoryBean是不會應用到MVC的那個ConversionService上。 對於mvcConversionService的配置途徑見
2 用法
2.1 Core Context的使用
主要用運用:
PropertyEditorSupport類
PropertyEditorRegistrar
CustomEditorConfigurer
2.1.1 自定義註冊編輯器
public class PointPropertEditor extends PropertyEditorSupport{
@Override
public void setAsText(String text) throws IllegalArgumentException {
String[] nums = text.split("," );
Point point = new Point();
point.setX(Integer.parseInt(nums[0]));
point.setY(Integer.parseInt(nums[1]));
setValue(point);
}
}
2.1.2 全域性配置
@Component
public class CustomPropertyEditorRegistrars implements PropertyEditorRegistrar{
@Override
public void registerCustomEditors(PropertyEditorRegistry registry) {
registry.registerCustomEditor(Point.class, new PointPropertEditor());
}
}
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="propertyEditorRegistrars">
<bean class="com.gz.spring.propertyEditor.CustomPropertyEditorRegistrars"/>
</property>
<bean>
2.1.1 區域性配置
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="com.gz.test.entity.Point">
<bean class="com.gz.spring.propertyEditor.PointPropertEditorr">
</bean>
</entry>
</map>
</property>
</bean>
2.2 MVC的使用
主要用運用:
PropertyEditorSupport類
@InitBinder
WebBindingInitializer介面
2.2.1 自定義註冊編輯器
public class DatePropertyEditor extends PropertyEditorSupport {
private static final Logger logger = LoggerFactory.getLogger(DatePropertyEditor.class);
@Override
public void setAsText(String text) throws IllegalArgumentException {
logger.info("型別轉換 傳入資料:"+text);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
setValue(df.parse(text));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
2.2.2 註冊屬性編輯器(註解)
2.2.2.1 單個類中@InitBinder註解(針對單個contoller)
@InitBinder
private void PointDataBinder(WebDataBinder webDataBinder) {
logger.info("型別轉換開始");
webDataBinder.registerCustomEditor(Date.class, new DatePropertyEditor());
}
2.2.2.2 整個專案@InitBinder註解(全域性)
@ControllerAdvice
public class InitBinderControllerAdvice {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Dept.class, new CustomDeptEditor());
}
}
2.2.3 註冊屬性編輯器(程式設計)
2.2.3.1 實現 WebBindingInitializer介面(全域性定義)
java程式碼:
public class DateWebBindingInitializer implements WebBindingInitializer{
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(Date.class, new DatePropertyEditor());
}
}
spring配置檔案:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer">
<bean class="com.mvc.editor.MyWebBindingInitializer" />
</property>
</bean>