前端传递过来一个日期字符串,但是后端需要使用Date类型进行接收,这时就需要一个类型转化器进行转化。我们有两种解决方案:
1. 自定义的类型转化器(就是一个类而已)-----注意:这种配置是作用于全局的
实现Spring框架内的Converter接口,将String类型转化为Data:
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy_MM_dd hh,mm,ss");
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
然后,我们需要在Springmvc的配置文件中进行配置:
<!-- 开启mvc的注解 -->
<mvc:annotation-driven conversion-service="conversionService" />
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean id="stringToDateConverter" class="cn.xxx.convertors.StringToDateConverter"/>
</set>
</property>
</bean>
和json数据转化器配置在一起时:
<!-- 注入我们写的转化器类的Bean -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean id="stringToDateConverter" class="cn.xxx.convertors.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 自定义Data类的转化器需要添加conversion-service属性,属性值是我们写的转化器类的Bean的id -->
<mvc:annotation-driven conversion-service="conversionService">
<!-- 自定义fastjson的转化器配置 -->
<mvc:message-converters>
<bean id="fastjson" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<!-- 这里顺序不能反,一定先写text/html,不然ie下会出现下载提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
2. 使用springmvc给我们提供的注解@DateTimeFormat,同时配合jackson提供的@JsonFormat注解几乎也可以满足我们的所有需求:
@DateTimeFormat:当从requestParam中获取string参数并需要转化为Date类型时,会根据此注解的参数pattern的格式进行转化。
@JsonFormat:当从请求体中获取json字符序列,需要反序列化为对象时,时间类型会按照这个注解的属性内容进行处理。
这两个注解需要加在实体类的对应字段上即可:
// 对象和json互相转化的过程当中按照此转化方式转(前后端互相转)
@JsonFormat(
pattern = "yyyy年MM月dd日",
timezone = "GMT-8"
)
// 从requestParam中获取参数并且转化(前端String转化为后端Data)
@DateTimeFormat(pattern = "yyyy年MM月dd日")
private Date birthday;
两个注解的区别极起作用的情况如下:
结束!