Working with Date Parameters in Spring – 在Spring中使用日期参数

最后修改: 2018年 10月 24日

1. Introduction


In this short tutorial, we’ll learn how to accept Date, LocalDate, and LocalDateTime parameters in Spring REST requests, both at the request and application level.

在这个简短的教程中,我们将学习如何在Spring REST请求中接受DateLocalDate,LocalDateTime参数,包括在请求和应用程序级别。

2. The Problem


Let’s consider a controller with three methods that accepts Date, LocalDate and LocalDateTime parameters:


public class DateTimeController {

    public void date(@RequestParam("date") Date date) {
        // ...

    public void localDate(@RequestParam("localDate") LocalDate localDate) {
        // ...

    public void dateTime(@RequestParam("localDateTime") LocalDateTime localDateTime) {
        // ...

When sending a POST request to any of those methods with a parameter formatted in accordance with ISO 8601, we’ll get an exception.

当向这些方法中的任何一个发送POST请求时,如果参数的格式符合ISO 8601的规定,我们将得到一个异常。

For example, when sending “2018-10-22” to the /date endpoint, we’ll get a bad request error with a message similar to this:

例如,当向/date端点发送 “2018-10-22 “时,我们会得到一个错误的请求,信息类似于此。

Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; 
  nested exception is org.springframework.core.convert.ConversionFailedException.

This is because by default, Spring cannot convert String parameters to any date or time object.


3. Convert Date Parameters on Request Level


One of the ways to handle this problem is to annotate the parameters with the @DateTimeFormat annotation, and provide a formatting pattern parameter:


public class DateTimeController {

    public void date(@RequestParam("date") 
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date date) {
        // ...

    public void localDate(@RequestParam("localDate") 
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) {
        // ...

    public void dateTime(@RequestParam("localDateTime") 
      @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) {
        // ...

This way the Strings will be properly converted to date objects, provided the Strings are formatted using the ISO 8601 format.

这样,字符串将被正确地转换为日期对象,前提是字符串的格式为ISO 8601格式。

We can also use our own conversion patterns by providing a pattern parameter in the @DateTimeFormat annotation:


public void date(@RequestParam("date") 
  @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {
    // ...

4. Convert Date Parameters at the Application Level


Another way to handle date and time object conversion in Spring is to provide a global configuration. By following the official documentation, we should extend the WebMvcConfigurationSupport configuration and its mvcConversionService method:


public class DateTimeConfig extends WebMvcConfigurationSupport {

    public FormattingConversionService mvcConversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);

        DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();
        dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));

        DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();
        dateRegistrar.setFormatter(new DateFormatter("dd.MM.yyyy"));

        return conversionService;

First, we create DefaultFormattingConversionService with a false parameter, which means Spring won’t register any formatters by default.


Then we need to register our custom formats for date and date-time parameters. We do this by registering two custom formatting registrars. The first one, DateTimeFormatterRegistar, will be responsible for parsing the LocalDate and LocaDateTime objects. The second one, DateFormattingRegistrar, will handle the Date object.


5. Configure Date-Time in Properties File


Spring also gives us the option to set global date-time formats via the application properties file. There are three individual parameters for the date, date-time, and time format:

Spring还为我们提供了通过应用程序属性文件设置全局日期-时间格式的选项。有三个单独的参数用于日期、日期-时间和时间格式。 HH:mm:ss

All of these parameters can be replaced with an iso value. For example, setting the date-time parameter as:


will be equal to ISO-8601 formatting:

将等于ISO-8601的格式化。 HH:mm:ss

6. Conclusion


In this article, we learned how to accept the date parameters in Spring MVC requests. We discussed how to do this per request, and globally.

在这篇文章中,我们学习了如何在Spring MVC请求中接受日期参数。我们讨论了如何在每个请求中以及在全局中这样做。

We also learned how to create our own date formatting patterns.


As always, all source code is available over on GitHub.