为什么要自定义转换器
我们有一个Person类
package com.lff;
import java.util.Date;
public class Person {
private int age;
private String name;
private Date birthDay;
//省略setter and getter
}
XML配置
<bean id="person" class="com.lff.Person">
<property name="name" value="lifufa" />
<property name="age" value="28" />
</bean>
上面的value值,如age的28都是String类型。
当注入到Person里面调用如下代码
public void setAge(int age) {
this.age = age;
}
Spring会自动转为int类型。有的是可以进行转化的,例如字符串转整型,但是有些数据类型之间是不能进行转换的,例如从“aaa”字符串到整型的转换。
不同的框架,肯定都有自己的数据转换的实现,比如MyBatis、Hibernate等这些转换器都是必备的。作为这么强大的Spring,肯定也是有的。
自定义转换器
拿String转Date为例,Spring内置的格式为yyy/MM/dd,如果是其他格式比如yyyy-MM-dd就转换不了啦,如
<bean id="person" class="com.lff.Person">
<property name="name" value="lifufa" />
<property name="age" value="28" />
<property name="birthDay" value="2021/11/11" />
</bean>
如果是yyyy-MM-dd格式就不行了
<bean id="person" class="com.lff.Person">
<property name="name" value="lifufa" />
<property name="age" value="28" />
<property name="birthDay" value="2021-11-11" />
</bean>
直接报错
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
- 在配置文件中告诉转换器的存在
```xml
<bean id="person" class="com.lff.Person">
<property name="name" value="lifufa" />
<property name="age" value="28" />
<property name="birthDay" value="2021-11-11" />
</bean>
<!-- id值为conversionService固定写法-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 自定义的转换器类可以有很多个-->
<bean class="com.lff.DateConverter" />
</set>
</property>
</bean>
外界使用如下
public static void main(String[] args) throws BeansException {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person) context.getBean("person");
System.out.println(person);
}
优化一下
转换器代码可以写的更加通用一点,让外界传入需要转换的格式。
package com.lff;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class DateConverter implements Converter<String, Date> {
private List<String> formates;
public void setFormates(List formates) {
this.formates = formates;
}
@Override
public Date convert(String s) {
for (String formate: formates) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formate);
try {
return simpleDateFormat.parse(s);
} catch (ParseException e) {
// e.printStackTrace();
}
}
return null;
}
}
配置文件代码
<bean id="person" class="com.lff.Person">
<property name="name" value="lifufa" />
<property name="age" value="28" />
<property name="birthDay" value="2021_11_11" />
</bean>
<!-- id值为conversionService固定写法-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 自定义的转换器类可以有很多个-->
<bean class="com.lff.DateConverter" >
<property name="formates">
<list>
<value>yyyy-MM-dd</value>
<value>yyyy_MM_dd</value>
</list>
</property>
</bean>
</set>
</property>
</bean>
完美!