2

我正在尝试编写一个将 Java 8 Instant 作为请求参数的 Spring MVC GET 控制器:

    @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 

Spring 似乎不喜欢它并抛出错误。这是错误消息:

    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

知道为什么我会得到这个吗?

谢谢

4

3 回答 3

3

错误消息不言自明:没有注册StringInstant转换器。

收到Controller请求时,所有参数都是Strings。Spring/Jackson 有大多数基本类型的预定义转换器列表: - String > Integer - String > Boolean

但是没有默认的 String > Instant 转换器。

您需要创建并注册一个。或者您可以将输入类型更改为 Spring 可以通过@DateTimeFormat注释处理的内容: How to accept Date params in a GET request to Spring MVC Controller?

于 2017-06-30T17:16:27.197 回答
0

也许这可以帮助你?使用 Jackson JSON 映射器序列化/反序列化 java 8 java.time我看到这个 Jackson 包含 Instant 类。

于 2017-07-04T09:43:17.913 回答
0

我怀疑 @DateTimeFormat 不适用于Instant字段。具体来说, Instant它没有在 Spring 参考文档中列为它适用的类型之一。

有关 Spring 自定义类型转换的详细信息,请查看Spring 参考第 9.5 节。创建一个Converter<String, Instant>转换器。第 9.5.5 节介绍了自定义类型转换器注册。

于 2017-06-30T17:30:27.673 回答