SpringMVC 自定义类型转换器
1 问题抛出
SpringMVC 可以自动为我们转换数据类型。
- age = 20 ⇒ String ⇒ Integer,正常转换,转换成功。
当有些数据格式 SpringMVC 不能为我们自动进行转换时,可以自定义类型转换器。
- 2020/08/21 ⇒ String ⇒ Date,正常转换,转换成功。
- 2020-08-21 ⇒ String ⇒ Date,转换异常,报错 400
如果希望 2020-08-21 这种格式被成功转换,就需要自定义类型转换器来覆盖原来的类型转换器。
2 自定义类型转换器
完整 demo 已上传 GitHub,地址:https://github.com/Jacks5320/springMvcStudy
2.1 自定义类型转换类
自定义类型转换类要求实现 Converter<S, T> 接口。
- s 为传入的字符串,T 为转换目标的类型。
public class StringToDate implements Converter<String, Date> {
/**
* 转换方法
*
* @param s 请求字符串
* @return 转换类型
*/
@Override
public Date convert(String s) {
if (s.contains("/") && !s.contains("-")) {
//格式化日期
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
try {
return df.parse(s);
} catch (Exception e) {
throw new RuntimeException("Date数据类型转换异常");
}
}
if (s.contains("-") && !s.contains("/")) {
//格式化日期
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
return df.parse(s);
} catch (Exception e) {
throw new RuntimeException("Date数据类型转换异常");
}
}
return null;
}
}
2.2 在 Spring 配置自定义类型转换器
<!-- 配置自定义转换器 -->
<bean id="conversionServiceFactoryBean"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.demo3.utils.StringToDate"/>
</set>
</property>
</bean>
<!--配置自定义类型转换器生效-->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
- 因为底层有默认的类型转换器,所以只需要将我们自己的类型转换器添加到 set 集合覆盖掉默认的类型转换器。
- 最后使用
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
标签来使之生效。
2.3 请求与结果
前端请求
<form action="demo/stringToDate">
<span>传入时间:</span><input type="text" name="date">
<input type="submit" value="传入">
</form>
后台打印结果