- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试像这样编码包含 ISO 格式时间戳的响应:
{
...
"time" : "2014-07-02T04:00:00.000000Z"
...
}
进入我的域模型对象中的 ZonedDateTime
字段。如果我使用以下代码段中评论的解决方案,最终它会起作用。SO 上有很多类似的问题,但我想得到一个具体的答案 将 JacksonJsonProvider
与 ObjectMapper + JavaTimeModule
一起使用的另一种方法有什么问题?
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
JacksonJsonProvider provider = new JacksonJsonProvider(mapper);
Client client = ClientBuilder.newBuilder()
// .register(new ObjectMapperContextResolver(){
// @Override
// public ObjectMapper getContext(Class<?> type) {
// ObjectMapper mapper = new ObjectMapper();
// mapper.registerModule(new JavaTimeModule());
// return mapper;
// }
// })
.register(provider)
.register(JacksonFeature.class)
.build();
我得到的错误:
javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.time.ZonedDateTime: no String-argument constructor/factory method to deserialize from String value ('2017-02-24T20:46:05.000000Z')
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@53941c2f
项目依赖是:
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.7'
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.7'
compile 'com.fasterxml.jackson.core:jackson-core:2.8.7'
compile 'com.fasterxml.jackson.core:jackson-databind:2.8.7'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.8.7'
compile 'org.glassfish.jersey.core:jersey-client:2.25.1'
编辑
反序列化发生在这里:
CandlesResponse<BidAskCandle> candlesResponse = webTarget.request()
.header(HttpHeaders.AUTHORIZATION,"Bearer "+token)
.accept(MediaType.APPLICATION_JSON)
.get(new GenericType<CandlesResponse<BidAskCandle>>(){});
最佳答案
Eventually it works if I use solution that is commented in following snippet.
首先,您的列表中缺少一个依赖项,而您也有,这就是问题所在。
jersey-media-json-jackson
此模块依赖于具有 JacksonJsonProvider
的 native Jackson 模块。当您注册 JacksonFeature
(随 jersey-media-json-jackson
一起提供)时,它会注册自己的 JacksonJaxbJsonProvider
,这似乎优先超过您提供的任何内容。
当您使用 ContextResolver
时,JacksonJsonProvider
实际上会查找 ContextResolver
并使用它来解析 ObjectMapper
。这就是它起作用的原因。无论您是使用 JacksonFeature
还是注册自己的 JacksonJsonProvider
(无需为其配置 ObjectMapper
),ContextResovler
都可以工作.
关于 jersey-media-json-jackson
模块的另一件事,它参与了 Jersey 的 auto-discoverable机制,它注册了它的 JacksonFeature
。所以即使你没有明确注册它,它仍然会被注册。避免它被注册的唯一方法是:
禁用自动发现(如 previous link 中所述)1
不要使用 jersey-media-json-jackson
。只需使用 Jackson 原生模块 jackson-jaxrs-json-provider
。不过,关于这一点的是,jersey-media-json-jackson
在 native 模块之上添加了一些功能,因此您会失去这些功能。
尚未测试,但似乎如果您使用 JacksonJaxbJsonProvider
而不是 JacksonJsonProvider
,它可能会起作用。如果您查看 source for the JacksonFeature
,您将看到它检查已注册的 JacksonJaxbJsonProvider
。如果有,它不会注册自己的。
我不确定的一件事是自动发现。它注册的顺序,如果它会影响它是否捕获你注册的JacksonJaxbJsonProvider
。您可以测试的东西。
<子>1。 See also
关于java - 使用 ObjectMapper + JavaTimeModule 将 JacksonJsonProvider 注册到 Jersey 2 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42468133/
我正在调用一个 API(使用 Jersey),它返回带时区偏移的日期时间。有时数据采用这种格式: "2017-03-28T14:40:00+01:00" 有时是这种格式(我无法控制) "2017-03
如果我创建一个 POJO 类并使用 mapper.writeValueAsString() 将整个对象转换为 Json方法,或者让 Spring 处理转换,JavaTimeModule正确使用,如果我
我刚刚发现,当我使用 JDK 8 时,我必须注册 JavaTimeModule 来添加对 java.time API 的支持。 @Bean public ObjectMapper ob
我想为本地日期设置全局 Jackson 序列化设置并使用类似 JavaTimeModule 的内容对于 java.time 但对于 JodaTime 的本地日期。 Joda Time 是否存在类似 J
当我尝试导入import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; 这是我的类(class): package com.linkedi
我定义了一个 JavaTimeModule: @Bean public Module java8TimeModule() { JavaTimeModule javaTimeModule = n
这个问题在这里已经有了答案: Is there a jackson datatype module for JDK8 java.time? (6 个答案) 关闭 5 年前。 不是重复的——我正在尝试
我正在尝试使用 Jackson 将对象从 JSON 序列化和反序列化(编码/解码)。其中一些对象具有 Java 8 LocalDate 和 ZonedDateTime。我在这里读到最好的选择是使用 j
我正在尝试像这样编码包含 ISO 格式时间戳的响应: { ... "time" : "2014-07-02T04:00:00.000000Z" ... } 进入我的域模型对象中的 ZonedD
我正在按照本教程使用 kubectl 命令从此处运行 Spark-Pi 应用程序。 https://github.com/GoogleCloudPlatform/spark-on-k8s-operat
我是一名优秀的程序员,十分优秀!