我正在使用 Spring Boot 2.0.0 RC1。我可以看到这个变化:https://github.com/spring-projects/spring-boot/commit/2fa0539e7f7bf93505f67303955cc7da6f9f5846和我的类路径上的 WebConversionService 类。我可以用我选择的日期格式提供它的一个 bean。然而这:
@RequestMapping(value = ["/test"], method = [RequestMethod.GET])
fun test2(@RequestParam param: LocalDate): LocalDate {
return param
}
当我用“2018-01-01”调用它时仍然不起作用。我知道我可以使用 @DateTimeFormat 但我试图避免这种情况并全局设置格式(或者理想情况下根本不设置它并让它正常工作,就像解析 JSON 主体一样)
最佳答案
要使这个新功能起作用,您需要在 application.properties
中设置 spring.mvc.date-format
属性。
请注意,使用通用 ISO 格式 yyyy-MM-dd
似乎存在问题:当我尝试这样做时,我遇到了以下异常:
无法将“java.lang.String”类型的值转换为所需类型“java.time.LocalDate”;嵌套异常是 org.springframework.core.convert.ConversionFailedException:无法从类型 [java.lang.String] 转换为类型 [@org.springframework.web.bind.annotation.RequestParam java.time.LocalDate] 的值 '2018 -04-20';嵌套的异常是 java.lang.IllegalArgumentException: Parse attempt failed for value [2018-04-20]
通过调试,发现根本原因是这个异常:
无法解析文本“2018-04-20”:无法从 TemporalAccessor 获取 LocalDate:{DayOfMonth=20,YearOfEra=2018,MonthOfYear=4},java.time.format.Parsed 类型的 ISO
我还发现用于解析的 DateTimeFormatter
由 toString()
表示:
Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)
我假设无法获得 LocalDate
的原因是构造的 TemporalAccessor
缺少 的值>Era
字段,但有填充的 YearOfEra
字段。
所以我尝试使用 uuuu-MM-dd
代替(请参阅 here 以了解 y
和 u
之间的区别),这很有效完美:
spring.mvc.date-format=uuuu-MM-dd
更新
新开了一个issue在 GitHub 上。
关于java - 在 Spring Boot 2 中,我如何接受 LocalDates 作为 RequestParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48774563/