SpringMVC实战(五)——数据转换

该文章基于《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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值