为什么要自定义转换器

我们有一个Person类

  1. package com.lff;
  2. import java.util.Date;
  3. public class Person {
  4. private int age;
  5. private String name;
  6. private Date birthDay;
  7. //省略setter and getter
  8. }

XML配置

  1. <bean id="person" class="com.lff.Person">
  2. <property name="name" value="lifufa" />
  3. <property name="age" value="28" />
  4. </bean>

上面的value值,如age的28都是String类型。
当注入到Person里面调用如下代码

  1. public void setAge(int age) {
  2. this.age = age;
  3. }

Spring会自动转为int类型。有的是可以进行转化的,例如字符串转整型,但是有些数据类型之间是不能进行转换的,例如从“aaa”字符串到整型的转换。
不同的框架,肯定都有自己的数据转换的实现,比如MyBatis、Hibernate等这些转换器都是必备的。作为这么强大的Spring,肯定也是有的。

自定义转换器

拿String转Date为例,Spring内置的格式为yyy/MM/dd,如果是其他格式比如yyyy-MM-dd就转换不了啦,如

  1. <bean id="person" class="com.lff.Person">
  2. <property name="name" value="lifufa" />
  3. <property name="age" value="28" />
  4. <property name="birthDay" value="2021/11/11" />
  5. </bean>

image.png

如果是yyyy-MM-dd格式就不行了

  1. <bean id="person" class="com.lff.Person">
  2. <property name="name" value="lifufa" />
  3. <property name="age" value="28" />
  4. <property name="birthDay" value="2021-11-11" />
  5. </bean>

直接报错

  1. Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthDay';

我们需要自定义转换器类

  • 新建类实现Converter接口 ```java package com.lff;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;

public class DateConverter implements Converter { @Override public Date convert(String s) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd”); try { return simpleDateFormat.parse(s); } catch (ParseException e) { e.printStackTrace(); } return null; } }

  1. - 在配置文件中告诉转换器的存在
  2. ```xml
  3. <bean id="person" class="com.lff.Person">
  4. <property name="name" value="lifufa" />
  5. <property name="age" value="28" />
  6. <property name="birthDay" value="2021-11-11" />
  7. </bean>
  8. <!-- id值为conversionService固定写法-->
  9. <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  10. <property name="converters">
  11. <set>
  12. <!-- 自定义的转换器类可以有很多个-->
  13. <bean class="com.lff.DateConverter" />
  14. </set>
  15. </property>
  16. </bean>

外界使用如下

  1. public static void main(String[] args) throws BeansException {
  2. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  3. Person person = (Person) context.getBean("person");
  4. System.out.println(person);
  5. }

image.png
优化一下
转换器代码可以写的更加通用一点,让外界传入需要转换的格式。

  1. package com.lff;
  2. import org.springframework.core.convert.converter.Converter;
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.List;
  7. public class DateConverter implements Converter<String, Date> {
  8. private List<String> formates;
  9. public void setFormates(List formates) {
  10. this.formates = formates;
  11. }
  12. @Override
  13. public Date convert(String s) {
  14. for (String formate: formates) {
  15. SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formate);
  16. try {
  17. return simpleDateFormat.parse(s);
  18. } catch (ParseException e) {
  19. // e.printStackTrace();
  20. }
  21. }
  22. return null;
  23. }
  24. }

配置文件代码

  1. <bean id="person" class="com.lff.Person">
  2. <property name="name" value="lifufa" />
  3. <property name="age" value="28" />
  4. <property name="birthDay" value="2021_11_11" />
  5. </bean>
  6. <!-- id值为conversionService固定写法-->
  7. <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  8. <property name="converters">
  9. <set>
  10. <!-- 自定义的转换器类可以有很多个-->
  11. <bean class="com.lff.DateConverter" >
  12. <property name="formates">
  13. <list>
  14. <value>yyyy-MM-dd</value>
  15. <value>yyyy_MM_dd</value>
  16. </list>
  17. </property>
  18. </bean>
  19. </set>
  20. </property>
  21. </bean>

完美!