如何在Spring Boot中全局配置`@ DateTimeFormat`模式?

时间:2017-08-01 14:42:16

标签: java spring-mvc spring-boot

我的Spring Boot应用程序,我有一些控制器接受日期作为查询参数:

@RestController
public class MyController {

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

这很有效,我甚至可以使用@RequestParam(value = "date", required = false)将参数标记为可选,然后使用Optional<LocalDate>。 Spring将处理所有这些并在缺少参数时传递一个空的Optional。

由于我有几个控制器使用日期作为查询参数,我想为所有LocalDate查询参数配置此行为。我尝试了spring.mvc.date-pattern属性,但它似乎只适用于java.util.Date

所以在搜索网页后,我提出的最好的是ControllerAdvice我从这个answer采用的。这个解决方案的问题是,无法处理Optional<LocalDate>。感觉这是在Spring Boot中配置行为的错误方法。

所以我的问题是:如何在Spring Boot中以惯用的方式全局配置用作查询参数的LocalDate模式?

3 个答案:

答案 0 :(得分:2)

目前这不容易实现(例如,通过设置简单的配置属性),请参阅#5523。我到目前为止找到的最佳解决方案是注册Formatter<LocalDate>。这也适用于建模为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);
      }
    };
  }

当合并#9930中的提案时,可以使用配置属性设置此项。

答案 1 :(得分:2)

您可以使用 spring.mvc.format.datespring.mvc.format.timespring.mvc.format.date-time

例如:
spring.mvc.format.time=HH:mm:ss
spring.mvc.format.date=iso
spring.mvc.format.date-time=iso-offset

如上例所示,您可以使用 spring boot 2.4.1 中的快捷方式 isoiso-offset

答案 2 :(得分:0)

@britter:谢谢。

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

请参阅# SPRING MVC (WebMvcProperties)属性。

更新:但是它不适用于Spring Data Rest参数...