SpringMvc 的请求中的参数(字符串)默认是不能自动地转换为日期的,需要使用 Converter, InitBinder 或者 Formatter 来把请求中的参数转换为日期。
使用 Converter
定义字符串转换为日期的类 DateConverter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package com.xtuer.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
public Date convert(String source) {
String pattern = source.length()==10 ? "yyyy-MM-dd" : "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
return format.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}SpringMvc 的配置文件中注册 Converter
1
2
3
4
5
6
7
8
9
10<mvc:annotation-driven conversion-service="customConversionService">
</mvc:annotation-driven>
<bean id="customConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.xtuer.converter.DateConverter"/>
</set>
</property>
</bean>处理请求
1
2
3
4
5
6@GetMapping("/to-date")
@ResponseBody
public Date toDate(Date date) {
System.out.println("=========>" + date);
return date;
}访问 http://localhost:8080/to-date?date=2016-04-12 或者 http://localhost:8080/to-date?date=2016-04-12%2012:12:12 能得到日期
2016-04-12
和2016-04-12 12:12:12
Converter 是全局的,可以在所有 Controller 中使用。
使用 InitBinder
Controller 中定义 InitBinder
1
2
3
4
public void initDate(WebDataBinder binder) {
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}处理请求
1
2
3
4
5
6
public Date toDate(Date date) {
System.out.println("=========>" + date);
return date;
}
注意: @InitBinder(“date”) 中 date 必须和 toDate(Date date) 中的 date 名字一样,当然,请求的参数中也必须有名为 date 的参数。
@InitBinder 只能在当前 Controller 中使用,当有多个地方都需要把参数转换为日期对象,则使用 Converter 更适合。