6.2.2 Spring支持的转换器 示例 使用ConversionService转换数据
6.2.2 Spring支持的转换器
Spring在org.springframework.core.convert.converter包中定义了3种类型的转换器接口,我们可以实现其中任意一种转换器接口,并将它作为自定义转换器注册到ConversionServiceFactoryBean当中。这3种类型转换器接口如下所示:
Converter接口
Converter<S,T>接口是Spring中最简单的一个转换器接口,该接口中只有一个方法:
1 | 此处有代码后面补上 |
该方法负责将S类型的对象转换为T类型的对象。
ConverterFactory接口
如果希望将一种类型的对象转换为另一种类型及其子类对象,比如将String转换为Number以及Number的子类Integer、Double等对象,就需要一系列的Converter,如StringToInteger、StringToDouble等。**ConverterFactory<S,R>接口的作用就是将相同系列的多个Converter封装在一起**。该接口中也只有一个方法:
1 | 此处有代码后面补上 |
S为转换的源类型,R为目标类型的基类,T为R的子类。
GenericConverter
Converter<S,T>接口只是负责将一个类型对象转换为另一个类型的对象,它并没有考虑类型对象上下文信息,因此并不能完成”复杂”类型的转换工作。**GenericConverter接口会根据源类对象及目标类对象的上下文信息进行类型转换**。该接口中定义了两个方法:
1 | 此处有代码后面补上 |
ConvertiblePair封装了源类型和目标类型,而TypeDescriptor包含了需要转换的类型对象的上下文信息,因此GenericConverter接口的convert()方法可以利用这些上下文信息完成类型转换的工作。
示例 使用ConversionService转换数据
域对象
1 | // 域对象,实现序列化接口 |
User提供了loginname和birthday属性,用于接收JSP页面传入的数据。注意,birthday属性的类型是一个java.util.Date,而JSP页面传入的控件数据类型都是String,这里就需要将String转换成Date对象。
测试链接
1 | <a href="registerForm">测试registerForm</a> |
请求处理方法
1 |
|
登录表单
1 |
|
表单处理方法
1 |
|
register方法只是简单地接收请求数据,并将数据转换并设置到User对象当中,转换工作使用自定义的转换器来完成,转换器的使用方法如下所示:
自定义转换器
这里的转换器通过实现Converter<S,T>接口的方法实现,Converter<String, Date>可以将String类型的数据转换为Date类型
1 | // 实现Converter<S,T>接口 |
使用自定义转换器
有了自定义转换器,接下来就要使用这个转换器了,在Spring配置文件中配置转换器的bean就行了.
在Sping配置文件中创建自定义转换器
1 | <!-- 自定义的类型转换器 --> |
在Spring配置文件中装配自定义转换器
1 | <!-- 装配自定义的类型转换器 --> |
在springmvc-config.xml配置文件中,使用了mvc:annotation-driven标签,该标签可以简化Spring MVC的相关配置,使用mvc:annotation-driven标签可以自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,这是SpringMVC为@Controllers注解分发请求所必需的。
除此之外,mvc:annotation-driven标签还会注册一个默认的ConversionService(FormattingConversionServiceFactoryBean),以满足大多数类型转换的需求。现在由于需要注册一个自定义的StringToDateConverter转换类,因此,需要显式定义一个ConversionService覆盖mvc:annotation-driven中的默认实现类,而这一步需要在,mvc:annotation-driven标签设置converters属性来完成。
填写表单

输入登录名和生日信息,单击”登录”按钮,转换器会自动将输入的日期字符串转换成Date类型,并将其设置到User对象的birthday属性当中。控制台输出如下所示:
1 | User [loginname=小明, birthday=Thu Sep 06 00:00:00 CST 126] |
可以看到,User对象的birthday属性已经获得JSP页面传入的日期值。
成功页面
1 | 登录名:${requestScope.user.loginname } |
成功显示效果
