我的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
模式?
答案 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.date、spring.mvc.format.time
和 spring.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 中的快捷方式 iso
和 iso-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参数...