小编典典

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

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我从该答案中采用的。该解决方案的问题是,无法解决Optional<LocalDate>了。感觉这是在Spring
Boot中配置行为的错误方法。

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


阅读 1636

收藏
2020-05-30

共1个答案

小编典典

当前这是不容易实现的(例如,通过设置简单的配置属性),请参阅#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中的提案合并后,可以使用配置属性来设置此设置。

2020-05-30