1、类型转换器概述
- ConversionService 是 Spring 类型转换体系的核心接口。
- 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个
ConversionService. Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring MVC 处理方法入参绑定等场合使用它进行数据的转换 - 可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器
例如:
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.czl.component.MyStringToEmployeeConverter"></bean>
</set>
</property>
</bean>
2、Spring 支持的转换器类型
Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中:
- Converter<S,T>:将 S 类型对象转为 T 类型对象
- ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类
- GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换
3、 自定义转换器示例
需求:字符串转换为对象。
1)写一个表单,用一个text直接接收一个字符串,使其转化为一个类
<!-- 解决问题:
1.数据类型转换
2.数据格式
3.数据校验
自定义类型转换器:
将字符串转换为Employee对象,完成添加功能
<form action="${path}/quickAdd" method="post">
<input type="text" name="empinfo" value="empAdmin-admin@qq.com-1-101">
<input type="submit" value="快速添加">
</form>
2)控制器方法
@RequestMapping("/quickAdd")// String -> Employee 需要类型转换器帮忙
public String quickAdd(@RequestParam("empinfo") Employee employee){
System.out.println(employee);
employeeDao.save(employee);
return "redirect:/emps";
}
3)自定义类型转换器
package com.czl.component;
import com.czl.bean.Employee;
import com.czl.dao.DepartmentDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.converter.Converter;
@Component
public class MyStringToEmployeeConverter implements Converter<String, Employee> {
@Autowired
DepartmentDao departmentDao;
/**
* 自定义的转换规则
*/
@Override
public Employee convert(String s) {
Employee employee = new Employee();
if(s.contains("-")){
String[] split = s.split("-");
employee.setLastName(split[0]);
employee.setEmail(split[1]);
employee.setGender(Integer.parseInt(split[2]));
employee.setDepartment(departmentDao.getDepartment(Integer.parseInt(split[3])));
return employee;
}
return null;
}
}
4)声明类型转换器服务,将这个Converter配置在ConversionService中
<!-- 告诉SpringMVC别用默认的ConversionService,
而用我自定义的ConversionService、可能有我们自定义的Converter; -->
<!-- 以后写自定义类型转换器的时候,就使用FormattingConversionServiceFactoryBean来注册;
既具有类型转换还有格式化功能 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.czl.component.MyStringToEmployeeConverter"></bean>
</set>
</property>
</bean>
5)、告诉SpringMVC使用这个ConversionService
<!-- conversion-service="conversionService":使用我们自己配置的类型转换组件 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
6)、源码上WebDataBinder上的ConversionService组件就替换了;