来看下面一个例子:
这里有一个实体类 Person
public class Person {
private String name;
private Integer age;
private Date date;
...
}
如果我们在配置文件中这么注入的话:
<bean class="edu.lsu.pojo.Person" id="person">
<property name="name" value="小王"/>
<property name="date" value="2000-08-21"/>
</bean>
就会报下面的错误 ❌:
看错误的提示信息是因为 String 类型无法转为 Date 类型。
因为我们这里指定的日期格式为 2000-08-21
,而 Spring 只支持将 2000/08/21
格式的字符串转化为 Date 类型。
所以才会报错,但是也有解决办法,Spring 也考虑到了这种情况,所以为我们提供了 Converter 接口,我们可以自定义类型转化。而 Converter
接口就是类型转化器。
Converter<String, Date>
该接口有两个泛型,第一个泛型指的是原始类型,第二个是目标类型,在我们的案例中是 String 和 Date。
public class MyConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
Date date = null;
try {
date = new SimpleDateFormat("yyyy-MM-dd").parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
使用 SimpleDateFormat
即可实现功能。
然后还需要在 Spring 的配置文件中配置。
1、 <bean class="edu.lsu.converter.MyConverter" id="myConverter"/>
2、 <bean class="org.springframework.context.support.ConversionServiceFactoryBean" id="conversionService">
<property name="converters" ref="myConverter"/>
</bean>
注意这里的第二步的 id 值必须是 conversionService
,不然会报错,因为 Spring 会根据这个 id 值创建对象,如果你改了他就找不到了。
再次运行代码就不会出现问题了。
date=Mon Aug 21 00:00:00 CST 2000
对于上面的代码还可以进一步的优化,比如日期格式是经常要变得,所以我们完全可以将格式分离出来,进一步的解耦合。
public class MyConverter implements Converter<String, Date> {
private String pattern;
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
@Override
public Date convert(String s) {
Date date = null;
try {
date = new SimpleDateFormat(pattern).parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
配置文件修改为:
<bean class="edu.lsu.converter.MyConverter" id="myConverter">
<property name="pattern" value="yyyy-MM-dd"/>
</bean>