在我的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。
@RequestParam(value = "date", required = false)
Optional<LocalDate>
由于我有几个使用日期作为查询参数的控制器,因此我想为所有LocalDate查询参数配置此行为。我已经尝试过该spring.mvc.date- pattern属性,但似乎只适用于java.util.Date。
LocalDate
spring.mvc.date- pattern
java.util.Date
因此,在网上搜索后,我想到的最好的就是ControllerAdvice我从该答案中采用的。该解决方案的问题是,无法解决Optional<LocalDate>了。感觉这是在Spring Boot中配置行为的错误方法。
ControllerAdvice
所以我的问题是:如何LocalDate在Spring Boot中以一种惯用的方式全局配置用作查询参数的模式?
当前这是不容易实现的(例如,通过设置简单的配置属性),请参阅#5523。到目前为止,我发现的最佳解决方案是注册一个Formatter<LocalDate>。这也可以与建模为的可选参数一起使用Optional<LocalDate>:
Formatter<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中的提案合并后,可以使用配置属性来设置此设置。