How to globally configure `@DateTimeFormat` patter

2020-06-03 06:33发布

Im my Spring Boot application, I have some controllers that accept a date as query parameter:

@RestController
public class MyController {

  @GetMapping
  public ResponseEntity<?> getDataByDate(
      @RequestParam(value = "date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
      final LocalDate date) {
    return ResponseEntity.ok();
  }
}

This works well, and I can even mark the parameter as optional using @RequestParam(value = "date", required = false) and then use an Optional<LocalDate>. Spring will handle all this and pass an empty Optional when the parameter is missing.

Since I have several controllers using dates as query parameters, I want to configure this behavior for all LocalDate query parameters. I have tried the spring.mvc.date-pattern property, but it only seems to work for java.util.Date.

So after searching the web, the best I came up with is a ControllerAdvice I adopted from this answer. The problem with this solution is, that is can not handle Optional<LocalDate> anymore. It feels like this is the wrong way to configure the behavior in Spring Boot.

So my question is: How do I globally configure the pattern for LocalDate used as query parameters in an idiomatic way in Spring Boot?

2条回答
▲ chillily
2楼-- · 2020-06-03 07:12

@britter: thanks.

spring.mvc.date-format= # Date format to use. For instance, dd/MM/yyyy works fine with Spring Boot 2.1.0.x

See # SPRING MVC (WebMvcProperties) properties.

UPDATE: But it doen't work for Spring Data Rest params ...

查看更多
来,给爷笑一个
3楼-- · 2020-06-03 07:15

This is currently not easily possible (e.g. by setting a simple configuration property), see #5523. The best solution I found so far is to register a Formatter<LocalDate>. This will also work with optional parameters modeled as Optional<LocalDate>:

  @Bean
  public Formatter<LocalDate> localDateFormatter() {
    return new Formatter<LocalDate>() {
      @Override
      public LocalDate parse(String text, Locale locale) throws ParseException {
        return LocalDate.parse(text, DateTimeFormatter.ISO_DATE);
      }

      @Override
      public String print(LocalDate object, Locale locale) {
        return DateTimeFormatter.ISO_DATE.format(object);
      }
    };
  }

It may become possible to set this using a configuration property when my proposal in #9930 has been merged.

查看更多
登录 后发表回答