Spring MVC-Converter数据转换器

  后台接收前端传过来的数据往往与后台定义的实体类的属性类型并不匹配,就需要用到数据类型转换,若在每个代码文件中手动去转就非常麻烦。Spring MVC提供了默认转换器,也提供了接口用于实现自定义的类型转换器。  

数据绑定流程

  Spring MVC通过反射机制对目标处理方法进行分析,并将请求消息绑定到处理方法的参数中。核心部件是DataBinder

  1. Spring MVC框架将ServletRequest对象处理方法的参数对象实例传递给DataBinder,
  2. DataBinder调用装配在Spring Web上下文中的ConversionService组件进行数据类型转换,数据格式化工作,并将ServletRequest中的消息填充到参数对象中。
  3. 然后调用Validator组件对已经绑定的请求消息的参数对象进行数据合法性郊验,并最终生成数据绑定结果BindingResult对象。

BindingResult对象包含已完成数据绑定的对象,还包含相应的校验错误对象,会被赋给处理方法的相应参数。

数据转换

  org.springframework.core.convert.ConversionService是Spring类型转换体系的核心接口,可以利用org.springframework.context.support.ConversionServiceFactoryBeanSpring的上下文中定义一个ConversionService。Spring 将自动识别出上下文中的ConversionService,并在 Spring MVC处理方法的参数绑定中使用它进行数据转换。

  Spring注解驱动<mvc:annotation-driven/>装配了一个默认的数据转换器ConversionService,可以满足大多数数据类型转换的需求, 当然也可以自定义转换器。

自定义数据转换器

实现Converter接口

  Spring在org.springframework.core.convert.converter包中定义了3种类型转换器接口,只需实现其中任意一种转换器接口,并将它作为自定义转换器注册到ConversionServiceFactoryBean中。

3种类型转换器接口如下所示:

  1. **Converter<S, T>:最简单的接口
    方法:
    T convert(S source);**,将S类型的对象转换为T类型的对象。
  2. ConverterFactory<S, R>
    该接口将相同系列多个Converter封装在一起。S 为源类型,R 为目标类型的基类,TR 的子类。
    方法:** Converter<S, T> getConverter(Class targetType);**,
  3. GenericConverter
    根据源类对象及目标类对象的上下文信息进行类型转换。
    方法1:Set getConvertibleTypes();
    方法2:Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);

示例代码

  1. 实现 Converter 接口的转换器类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import org.springframework.core.convert.converter.Converter;

    public class StringToDateConverter implements Converter<String, Date>{

    private String datePattern;

    public void setDatePattern(String datePattern) {
    this.datePattern = datePattern;
    }

    @Override
    public Date convert(String date) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(this.datePattern);
    try {
    return simpleDateFormat.parse(date);
    } catch (ParseException e) {
    e.printStackTrace();
    }
    return null;
    }
    }
  2. Springmvc.xml配置文件加入自定义转换器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- 注解驱动,替换默认的转换器 -->
    <mvc:annotation-driven conversion-service="conversionService" />

    <!-- 自定义的类型转换器 -->
    <bean id="conversionService"
    class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
    <list>
    <!-- 自定义转换器 -->
    <bean class="com.commons.utils.StringToDateConverter">
    <property name="datePattern" value="yyyy-MM-dd HH:mm:ss"></property>
    </bean>
    </list>
    </property>
    </bean>
  3. 定义一个User实体类,添加Date类型的birtyday属性。
  4. 后台Controller处理方法使用对象接收前端请求的参数。
  5. 前端发送请求,带有日期格式的birtyday参数发给后台。

@InitBinder自定义编辑器转换数据

创建一个编辑器类,继承PropertyEditorSupport,在Controller层增加initBinder()方法,使用@InitBinder注解。
比较麻烦,不建使用

WebBindingInitializer注册全局自定义编辑器转换数据

  1. 实现WebBindingInitializer接口,重写initBinder()方法,在方法中注册自定义编辑器。
  2. springmvc.xml中装配自定义编辑器。
作者

光星

发布于

2018-02-11

更新于

2022-06-17

许可协议

评论