使用 ObjectMapper + JavaTimeModule 将 JacksonJsonProvider 注册到 Jersey 2 客户端

2023-12-22

我正在尝试整理包含 ISO 格式时间戳的响应,如下所示:

{
...
    "time" : "2014-07-02T04:00:00.000000Z"
...
}

into ZonedDateTime我的域模型对象中的字段。最终,如果我使用以下代码片段中注释的解决方案,它就会起作用。SO 有很多类似的问题,但我想得到具体的答案 另一种使用方法有什么问题JacksonJsonProvider with 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'

edit

反序列化发生在这里:

CandlesResponse<BidAskCandle> candlesResponse = webTarget.request()
                .header(HttpHeaders.AUTHORIZATION,"Bearer "+token)
                .accept(MediaType.APPLICATION_JSON)
                .get(new GenericType<CandlesResponse<BidAskCandle>>(){});

如果我使用以下代码片段中注释的解决方案,最终它会起作用。

首先,您的列表中缺少一个依赖项,而您也有这个依赖项,这就是问题所在。

jersey-media-json-jackson

该模块依赖于具有以下功能的本机 Jackson 模块JacksonJsonProvider。当您注册时JacksonFeature(附带jersey-media-json-jackson),它注册自己的JacksonJaxbJsonProvider,这似乎优先于您提供的任何内容。

当您使用ContextResolver, the JacksonJsonProvider实际上查找的是ContextResolver并用它来解决ObjectMapper。这就是它起作用的原因。无论您是否使用过JacksonFeature或注册您自己的JacksonJsonProvider(无需配置ObjectMapper对于它)ContextResovler会工作。

另一件事是关于jersey-media-json-jackson模块,它参与 Jersey 的自动发现 https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/deployment.html#deployment.autodiscoverable机制,它注册它的JacksonFeature。因此,即使您没有明确注册它,它仍然会被注册。避免其被注册的唯一方法是:

  1. Disable the auto-discovery (as mention in the previous link https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/deployment.html#deployment.autodiscoverable)1

  2. 不要使用jersey-media-json-jackson。只需使用 Jackson 原生模块jackson-jaxrs-json-provider。但问题是,jersey-media-json-jackson在本机模块之上添加了一些功能,因此您将失去这些功能。

  3. 没有测试过,但似乎如果你使用JacksonJaxbJsonProvider代替JacksonJsonProvider,它可能会起作用。如果你看一下来源为JacksonFeature https://github.com/jersey/jersey/blob/2.25.1/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/JacksonFeature.java#L85,你会看到它检查已经注册的JacksonJaxbJsonProvider。如果有的话,它不会注册自己的。

    我不确定的一件事是自动发现。注册的顺序,如果会影响是否抓到你注册的JacksonJaxbJsonProvider。您可以测试一下。


脚注

1. See also https://stackoverflow.com/a/30281912/2587435

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ObjectMapper + JavaTimeModule 将 JacksonJsonProvider 注册到 Jersey 2 客户端 的相关文章

  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s

随机推荐

  • 发送消息时在 Thunderbird 扩展中获取发件人和收件人

    我正在尝试创建一个 Thunderbird 扩展 这是一种引导 无需重新启动的类型 我的意思是 javascript 代码是not从覆盖层运行 相反 侦听器会针对各种事件触发 在某些时候 当用户决定发送消息时 我想检查发件人和收件人 收件人
  • Xcode 下载失败。使用“购买”页面重试。 Xcode 9.3。 MacOS 高山

    将 MacOS 升级到 High Sierra 后 我尝试更新 Xcode 并得到以下信息 Xcode 下载失败 使用 购买 页面重试 我卸载了 Xcode 并尝试再次安装 但没有成功 我阅读了一些解决此问题的提示 但没有任何帮助 删除 L
  • 在Python中根据每日的pct_change计算初始值

    假设我有一个逐日增长率数据如下 其中初始值我们未知 date dod change 0 2020 1 1 0 262713 1 2020 1 2 0 216778 2 2020 1 3 0 217069 3 2020 1 4 0 26811
  • Github Actions 动态容器名称

    Summary Github Actions 允许使用 Docker 容器来运行作业 但它似乎不允许为此容器映像提供动态值 使用环境变量 这有效 不是所需的解决方案 jobs pytest test container image ghcr
  • .gitmodules 和在 .git/config 中指定子模块之间的区别?

    可能是非常愚蠢的问题 但到目前为止我一直在 gitmodules 文件中指定子模块 最近我突然想到 也许出于同样的原因可以使用 git config 这样我就不必在工作目录中保留无关的文件了 git config submodule pat
  • 信息窗口在 didTapAtCoordinate 方法中不显示标记

    我想展示infowindow and marker两者同时进行 code void set markerOnMap double lat longitude double lon GMSMarker marker GMSMarker all
  • 在 cypress.env.json 中定义变量

    我想为所选应用程序的测试定义全局变量 我想将它们输入到一个文件中 阅读完文档后我决定使用cypress env json https docs cypress io guides guides environment variables h
  • 修复 Mercurial 中的错误合并

    在我们的 Mercurial 项目配置中 我们在一个存储库中有 3 个分支 一种是稳定版本分支 其中完成紧急错误修复 一种是包含新功能代码的功能分支 一种是 UAT 分支 其中错误修复和新功能合并以提供最新的代码库 我们已将大量新功能代码合
  • 使用 Perl 提取方括号“[]”之间的数据

    我使用正则表达式从弯曲的括号 或 括号 中提取数据 例如提取a b from a b 如下所示 我有一个文件 其中每一行都会像 this is the range of values a1 b1 and b1 a1 this is the
  • PowerShell 无法确定正在使用哪个参数集

    我有一个带有四个参数的函数 其中两个可以设置也可以不设置 我尝试使用参数集来确定已设置哪些参数 但在参数集解析方面遇到了一些问题 这些是四个可能的参数集 既不是ErrorObject也不是SplunkData 错误对象和 Splunk 数据
  • 什么是核心动画的字节对齐(缓存行对齐)?为什么这很重要?

    我以非惰性方式在滚动视图上加载图像 因此不会出现卡顿行为 代码有效 FPS 接近 60 但是 我不明白什么是核心动画的字节对齐 或缓存行对齐 如上所述here https github com path FastImageCache byt
  • SocketIO,无法从客户端发送发射数据

    我在尝试使用 SocketIO 将数据从客户端浏览器发送到我的节点服务器时遇到了最奇怪的问题 从服务器发送到客户端工作得很好 但反过来我会得到一个未定义的错误 这是它的快速外观 非常简单 节点服务器 app js io on connect
  • 如何使用纯 JavaScript 防止输入字段中出现空格

    我有一个用户名输入字段 并试图阻止用户用空格填充它们
  • jQuery - 使用 AJAX 加载内容时 document.ready 不会触发

    我有一个简单的自定义选项卡模块 它使用 AJAX 请求加载选项卡 通过 elem load 在每个使用 AJAX 加载的页面上 我都有一些 JavaScript 第一次加载页面时 通过直接输入 URL 而不是 AJAX JavaScript
  • 将 NSManagedObject 存储在字典中(NSDictionary)

    我有一个自定义类 它是NSManagedObject 我想将其存储在字典中 但是当尝试这样做时 我收到了Property list invalid for format 200 error 这是我尝试创建字典的方法 NSDictionary
  • C# 中继承的性能注意事项

    如果我使用以下命令创建一个类 编译器是否会生成相同的 ILpublic int I 或任何其他字段 与创建一个从具有以下属性的基类继承的类public int I 无论哪种方式 生成的类的行为都是相同的 但是编译器的行为是否相同 即 编译器
  • 为什么在 IntelliJ 14+ 上运行简单的 scala 程序时会出现 ClassNotFoundException?

    我无法弄清楚这个程序出了什么问题 我正在使用旧版本的 scala 2 7 因为它与我正在使用的某些库兼容 这是我尝试运行的一个简单程序 该程序运行良好使用scalac and scala命令 但是在 IntelliJ 14 上 gt 当我c
  • 如何在Python中分割文件?

    是否可以分割文件 例如 您有一个巨大的单词列表 我想将其拆分 使其成为多个文件 这怎么可能 这个用换行符分割文件并将其写回 您可以轻松更改分隔符 如果您的输入文件中没有多个 splitLen 行 本例中为 20 行 这也可以处理不均匀的数量
  • EF core“点赞”功能的动态表达

    我编写了一些代码来创建动态表达式来过滤我的分页 我正在尝试制作 EF Core 内置函数的动态表达式以进行搜索 EF Functions Like 我尝试过像bottom这样的方法 但它是一种扩展方法 调用该方法时不使用第一个参数 我不知道
  • 使用 ObjectMapper + JavaTimeModule 将 JacksonJsonProvider 注册到 Jersey 2 客户端

    我正在尝试整理包含 ISO 格式时间戳的响应 如下所示 time 2014 07 02T04 00 00 000000Z into ZonedDateTime我的域模型对象中的字段 最终 如果我使用以下代码片段中注释的解决方案 它就会起作用