我正在尝试编写一个Spring MVC GET控制器,该控制器将Java 8 Instant作为请求参数:
@GetMapping
@JsonView(OrderListing.class)
@Validated
public WebSeekPaginatedResultsDto<OrderListingDto> findAll(@Valid OrderSearchCommand orderSearchCommand) {
// Some code
}
跟:
public class OrderSearchCommand {
private Instant dateCreatedStart;
private Instant dateCreatedEnd;
// Some other fields
}
我正在从一些 React/Javascript 代码中触发一个 GET 请求,如下所示:
http://localhost:8080/mms/front/orders?dateCreatedStart=2017-05-31T22%3A00%3A00.000Z
春天似乎不喜欢它,并抛出了一个错误。以下是错误消息:
Failed to convert property value of type 'java.lang.String' to required type 'java.time.Instant' for property 'dateCreatedStart';
nested exception is java.lang.IllegalStateException:
Cannot convert value of type 'java.lang.String' to required type 'java.time.Instant' for property 'dateCreatedStart': no matching editors or conversion strategy found
知道我为什么得到这个吗?
谢谢
错误消息是不言自明的: 转换器没有注册Instant
String
。
当Controller
收到请求时,所有参数都String
s。 Spring/Jackson具有大多数基本类型的预定义转换器列表: - 字符串>整数 - 布尔>字符串
但是没有默认的字符串>即时转换器。
您需要创建并注册一个。或者,您可以将输入类型更改为 Spring 可以使用@DateTimeFormat
注释处理的内容: 如何接受 GET 请求中的日期参数到 Spring MVC 控制器?
我怀疑@DateTimeFormat不适用于Instant
字段。 具体说来 Instant
未在 Spring 参考文档中列为其工作类型之一。
查看 Spring 参考第 9.5 节,了解有关 Spring 自定义类型转换的详细信息。 创建Converter<String, Instant>
转换器。 第 9.5.5 节介绍自定义类型转换器注册。
也许这可以帮助你? 序列化/反序列化 Java 8 java.time with Jackson JSON 映射器 我看到这个杰克逊包括即时类。