(一)需求
传递自定义日期格式的时间,比如:2018-08-22 21-40-10
或者2018-08-22 21:40:10
。
1、Order
public class Order extends BaseBean {
/**
* 商户id
*/
private Integer businessId;
/**
* 用户id
*/
private Integer userId;
/**
* 价格
*/
private Double price;
/**
* 创建时间
*/
private Date createDate;
}
2、前端通过ajax请求,创建订单
common.ajax1({
url : ...,
type : "POST",
data : {
"businessId" : "1",
"userId" : "1",
"price" : "100",
"createDate" : "2018-08-22 21:40:10"
}
});
3、后台接收请求,并进行参数绑定
@RequestMapping(value = "/order", method = RequestMethod.POST)
public ApiCodeDto order(Order order){
return orderService.order(order);
}
问题:
到这里问题就出现了,ajax
传送过来的businessId
、userId
、price
都能正常绑定到参数order
中,就createDate
不行,因为日期数据有很多种格式,springmvc没办法把字符串转换成日期类型,所以order
实例对象中的createDate
属性为null
。
解决办法:
自定义参数绑定!
(二)自定义参数绑定
1、自定义参数绑定实现原理
前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。
一般使用<mvc:annotation-driven/>
注解驱动加载处理器适配器,可以在此标签上进行配置。
2、具体编码
2.1自定义Converter
//Converter<S, T>
//S:source,需要转换的源的类型
//T:target,需要转换的目标类型
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
// 把字符串转换为日期类型(这里的yyy-MM-dd HH:mm:ss根据前端什么样式就改为什么样式)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(source);
return date;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 如果转换异常则返回空
return null;
}
}
2.2配置Converter
<!-- 配置注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="cn.itcast.springmvc.converter.DateConverter" />
</list>
</property>
</bean>
2.3实现参数自动转换
配置好这个参数以后,就会将特定格式的日期字符串自动换为Date
类型,无需再手动编码。