簡體   English   中英

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

[英]How to globally configure `@DateTimeFormat` pattern in 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 中配置行為的錯誤方式。

所以我的問題是:如何在 Spring Boot 中以慣用的方式全局配置用作查詢參數的LocalDate模式?

這目前不容易實現(例如通過設置簡單的配置屬性),請參閱#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中的提案被合並后,可以使用配置屬性來設置它。

@britter:謝謝。

spring.mvc.date-format= # Date format to use. For instance, dd/MM/yyyy 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 參數......

您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM