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

2022-09-03 14:56:56

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

@RestController
public class MyController {

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

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

由于我有多个使用日期作为查询参数的控制器,因此我想为所有查询参数配置此行为。我已经尝试了这家酒店,但它似乎只适用于.LocalDatespring.mvc.date-patternjava.util.Date

因此,在搜索网络之后,我想出的最好的是我从这个答案中采用的。这个解决方案的问题是,那就是无法再处理了。感觉这是在Spring Boot中配置行为的错误方法。ControllerAdviceOptional<LocalDate>

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


答案 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中的提案被合并时,可以使用配置属性来设置它。


答案 2

@britter:谢谢。

spring.mvc.date-format= # Date format to use. For instance, dd/MM/yyyy与Spring Boot 2.1.0.x一起工作正常

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

更新:但它不适用于春季数据休息参数...


推荐