该文章基于《Spring+MyBatis企业应用实战》进行总结,旨在积累巩固
SpringMVC中数据绑定与数据转换的流程
ServletRequest+参数对象→DataBinder→ConversionService→Validator→BindingResult→将结果赋值给处理方法的相应参数
数据转换
java自带的PropertyEditor接口可以用于数据转换,只不过该接口只能用于字符串和Java对象的转换,并且对于上下文信息不敏感。
Spring的通用类型转换模块位于org.springframework.core.convert中,其中ConversionService是转换体系的核心接口,可以通过注册ConversionServiceFactoryBean,从而Spring将自动识别出上下文中的ConversionService,并在参数绑定中使用它进行数据转换,如下进行配置:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"/>
Spring中定义了3种类型的转换器接口,并可以将他们作为自定义转换器注册到ConversionServiceFactoryBean中:
1.Converter<S,T>接口,将S转化为T,该接口只有一个方法
T convert(S source)//唯一方法
2.ConverterFactory<S,R>接口,将一种类型的对象转换为另一种类型及其子类的对象,该接口只有一个方法
<T extends R>Converter<S,T> getConverter(Class<T> targetType)
3.GenericConverter,该接口考虑到了对象的上下文信息,会根据原类对象的上下文信息进行类型转换工作,该接口有两个方法
Set<GenericConverter.ConvertiblePair> getConvertibleTypes();
Object convert(Object var1, TypeDescriptor var2, TypeDescriptor var3);
使用数据转换器
方法一:通过@InitBinder进行注册
@InitBinder注解时方法层面的注解,并且在Controller中进行注解,用于在控制器初始化时注册属性编辑器:
public class MyConverter extends PropertyEditorSupport{//该类用于进行String到指定类型的转换
@Override
public void setAsText(String text){
//对参数的处理
setValue(结果);
}
}
@Controller
public XXX{
@InitBinder
public void initBinder(WebDataBinder binder){
binder.registerCustomEditor(需要转换为的类,new MyConverter());
}
}
方法二:实现三种接口之一并进行注册
根据不同的需求实现不同的接口,来完成自定义的数据类型转化,需要注意的时,<mvc:annotation-driven/>会默认注册FormattingConversionServiceFactoryBean,以满足大多数类型的需求,所以我们需要重写该属性:
<mvc:annotation-driven conversion-service="ConversionServiceFactoryBean的id"/>
<bean id="conversionservicefactory的id" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="你所实现的三个接口之一的实现类"/>
</list>
</property>
</bean>
方法三:使用WebBindingInitializer注册全局自定义编辑器转换数据:
public class DateBinderInitializer implements WebBindingInitalizer{
@Override
public void initBinder(WebDataBinder binder,WebRequest request){
binder.registerCustomEditor(Date.class, new DateEditor());
}
}
首先需要一个WebBindingInitalizer接口的实现类,然后在[servletname]-config.xml中配置全局的自定义编辑器:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="WebBindingInitalizer">
<bean class="WebBindingInitalizer实现类">
</property>
</bean>
SpringMVC按照如下的优先顺序查找对应的编辑器:
@InitBinder → ConversionService → WebBinderInitializer