SpringMVC使用自定义类型转换器

922 阅读1分钟

1.问题提出

虽然SpringMVC可以完成大部分的类型转化,但少数情况下,需要我们自己定义类型转换器。

如日期格式,SpringMVC能将yyyy/MM/dd格式的日期自动映射给Date类型

但如果我想使用yyyy-MM-dd格式,就需要自己定义类型转换器,否则会报400错误

先测试一下不配自定义类型转换器,用yyyy-MM-dd格式转换:

控制层:

@RequestMapping(value = "/date")
@ResponseBody
public void date(Date date){
    System.out.println(date);
}

image.png

2.解决

2.1编写自定义类型转换器,实现Convert接口的convert方法

/**
 * 1.自定义日期类型转换器,实现Convert接口(S,R)
 * S-原始类型
 * R-转换后类型
 */
public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String dateStr) {
        Date date=null;
        try {
             date = new SimpleDateFormat("yyyy-MM-dd").parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

2.2在xml中声明该类型转换服务

<!--声明自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.itheima.converter.DateConverter"></bean>
        </set>
    </property>
</bean>

2.3在xml annotation-driven标签中引用该类型转换服务

<!--conversion-service="conversionService"引用自定义转换服务-->
<mvc:annotation-driven conversion-service="conversionService"/>

这里的conversionService需要与上一步的id保持一致

3.测试

image.png

image.png

成功解决

4.注意

如果配了自定义的类型转换器,原来的yyyy/MM/dd方式就不能使用了,否则后台报ParseException

5.总结

对于需要自定义类型转换器的场景,分三步完成

1.编写自定义类型转换器,实现Convert接口的convert方法

2.将该自定义类型转换器注入到ConversionServiceFactoryBean的converters属性中(声明自定义类型转换服务)

3.引用类型转换服务<mvc:annotation-driven conversion-service="类型转换服务id">