java - 在 Spring Boot 2 中,我如何接受 LocalDates 作为 RequestParams

标签 java spring spring-boot

我正在使用 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

我还发现用于解析的 DateTimeFormattertoString() 表示:

Value(YearOfEra,4,19,EXCEEDS_PAD)'-'Value(MonthOfYear,2)'-'Value(DayOfMonth,2)

假设无法获得 LocalDate 的原因是构造的 TemporalAccessor 缺少 的值>Era 字段,但有填充的 YearOfEra 字段。

所以我尝试使用 uuuu-MM-dd 代替(请参阅 here 以了解 yu 之间的区别),这很有效完美:

spring.mvc.date-format=uuuu-MM-dd

更新

新开了一个issue在 GitHub 上。

关于java - 在 Spring Boot 2 中,我如何接受 LocalDates 作为 RequestParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48774563/

相关文章:

javascript - Selenium: "is not clickable at point"如何等待所有脚本加载完毕

java - 套接字 IO 事件多次触发 NodeJS

spring-boot - 自升级到 spring boot v2 以来,h2Database 上的 flyway 迁移出错

java - 如何使用 SAX 解析器在 XML 中添加元素?

java - 在 Java 中清理 JSON 字符串值

spring - 如何将Spring Boot RESTful Web服务Docker镜像部署到EC2?

java - 从java类中的spring文件访问属性

Spring + Tomcat 基于Request URL的 Multi-Tenancy

java - 通过maven打包时出现Spring boot错误

spring - 未提供 API 定义 Swagger 无法显示文档