SpringMVC - 数据类型转换与类型转换器

    xiaoxiao2021-03-25  119

    ConversionService是Spring类型转换体系的核心接口,可以利用conversionServiceFactoryBean在Spring工厂容器中定义一个conversionService。

    Spring将自动识别出ConversionService,并在bean属性配置及SpringMVC处理方法入参绑定等场合使用它进行数据转换。

    SpringMVC上下文中内建了很多转换器,可以完成大多数Java类型的转换工作:


    【1】实现自定义转换器

    Spring定义了三种类型的转换器接口,实现任意一个接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中。

    ① Converter<S,T>: 将S类型对象转换为T类型对象;

    ② ConverterFactory

    将相同系列多个"同质" Converter封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将String转换为Number及Number的子类(Integer、Long、Double等)对象)。

    ③ GenericConverter

    会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。

    如果想把一个字符串转换成其它实体类型,spring没有提供这样默认的功能,我们需要自定义类型转换器。

    自定义类型转换器示例

    需求如下:这里有个实体类Employee,将传输参数(String类型)转换为Employee。

    @Component //实现了Converter<String, Employee> 接口 public class EmployeeConverter implements Converter<String, Employee> { @Override public Employee convert(String source) { if(source != null){ String [] vals = source.split("-"); //GG-gg@web.com-0-105 if(vals != null && vals.length == 4){ String lastName = vals[0]; String email = vals[1]; Integer gender = Integer.parseInt(vals[2]); Department department = new Department(); department.setId(Integer.parseInt(vals[3])); Employee employee = new Employee(null, lastName, email, gender, department); System.out.println(source + "--convert--" + employee); return employee; } } return null; } }

    【2】将自定义转换器注册到容器

    可通过ConversionServiceFactoryBean的converters属性注册自定义的类型转换器。

    示例如下:

    <!-- 配置 ConversionService 数据类型的转换和格式化 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="employeeConverter"/> <!-- 自定义转换器 以前的一样存在 --> </set> </property> </bean> <mvc:annotation-driven conversion-service="conversionService"> </mvc:annotation-driven> //将自定义的conversionService注册到Spring MVC的上下文中

    上面配置文件中我们使用配置了一个FormattingConversionServiceFactoryBean。虽然可以使用ConversionServiceFactoryBean,但是不推荐。

    转载请注明原文地址: https://ju.6miu.com/read-17050.html

    最新回复(0)