SpringMVC 接收日期参数

SpringMvc 的请求中的参数(字符串)默认是不能自动地转换为日期的,需要使用 Converter, InitBinder 或者 Formatter 来把请求中的参数转换为日期。

使用 Converter

  1. 定义字符串转换为日期的类 DateConverter

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package 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> {
    @Override
    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;
    }
    }
  2. 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>
  3. 处理请求

    1
    2
    3
    4
    5
    6
    @GetMapping("/to-date")
    @ResponseBody
    public Date toDate(Date date) {
    System.out.println("=========>" + date);
    return date;
    }
  4. 访问 http://localhost:8080/to-date?date=2016-04-12 或者 http://localhost:8080/to-date?date=2016-04-12%2012:12:12 能得到日期 2016-04-122016-04-12 12:12:12

Converter 是全局的,可以在所有 Controller 中使用。

使用 InitBinder

  1. Controller 中定义 InitBinder

    1
    2
    3
    4
    @InitBinder("date")
    public void initDate(WebDataBinder binder) {
    binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
  2. 处理请求

    1
    2
    3
    4
    5
    6
    @GetMapping("/to-date")
    @ResponseBody
    public Date toDate(Date date) {
    System.out.println("=========>" + date);
    return date;
    }

注意: @InitBinder(“date”) 中 date 必须和 toDate(Date date) 中的 date 名字一样,当然,请求的参数中也必须有名为 date 的参数。

@InitBinder 只能在当前 Controller 中使用,当有多个地方都需要把参数转换为日期对象,则使用 Converter 更适合。