如何将 Jersey 与较新版本的 jackson 一起使用

2023-12-07

我正在使用 Jersey (2.23.1)jersey-media-json-jackson。但这与 Jackson 2.5.4 相关。但我需要使用 Jackson 2.6.0(或更新版本)。

我怎样才能做到这一点?

我尝试在我的 pom.xml 中设置它:

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-jsonSchema</artifactId>
        <version>2.6.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.6.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-xml-provider</artifactId>
        <version>2.6.0</version>
    </dependency>

然后使用jackson 2.6.0。 (我也尝试过新版本。)

但我的休息应用程序抛出了各种NoSuchMethodError or ClassNotFoundExceptions, like:

org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase.<init>(Lcom/fasterxml/jackson/databind/cfg/MapperConfig;)

有没有办法将 Jersey 2.23.1 与 Jackson 2.6.0 或更高版本一起使用?蒂亚!

更新1:

这是完整的堆栈跟踪:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase.<init>(Lcom/fasterxml/jackson/databind/cfg/MapperConfig;)V
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:489)
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341)
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:499)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase.<init>(Lcom/fasterxml/jackson/databind/cfg/MapperConfig;)V
    at org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:278)
    at org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:260)
    at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:509)
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:334)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305)
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154)
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473)
    ... 22 common frames omitted
Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase.<init>(Lcom/fasterxml/jackson/databind/cfg/MapperConfig;)V
    at com.fasterxml.jackson.jaxrs.xml.XMLEndpointConfig.<init>(XMLEndpointConfig.java:22)
    at com.fasterxml.jackson.jaxrs.xml.XMLEndpointConfig.forReading(XMLEndpointConfig.java:27)
    at com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider._configForReading(JacksonXMLProvider.java:137)
    at com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider._configForReading(JacksonXMLProvider.java:47)
    at com.fasterxml.jackson.jaxrs.base.ProviderBase._configForReading(ProviderBase.java:467)
    at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:775)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
    at org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:271)
    at org.glassfish.jersey.server.internal.inject.EntityParamValueFactoryProvider$EntityValueFactory.provide(EntityParamValueFactoryProvider.java:96)
    at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)
    at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:94)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
    ... 31 common frames omitted

Update 2

以下是我为球衣启用杰克逊的方法:

    register(JacksonFeature.class);
    register(JacksonXMLProvider.class);

当你想覆盖一个版本时,你需要查看pom.xml模块的。您在链接中看到明确声明了三个 Jackson 依赖项

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-base</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
</dependency>

当您想使用新版本时,您有多种选择。您可以显式声明all其中包含您想要的版本的 pom.xml 文件,或者您可以exclude所有依赖项,只需显式声明主要依赖项即可。

对于显式声明的选项,您可以只使用上述所有三个,指定您想要的版本。显式声明优先于及物的依赖关系。所以明确声明的永远是被拉进来的,而不是被 Jersey 拉进来的。

对于排除选项,您可以将它们排除在jersey-media-json-jackson,然后添加主要的一个,将其他所有内容都拉进去。在这种情况下jackson-jaxrs-json-provider把另外两个拉进来,所以你真的只需要声明那个

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.23.1</version>
    <exclusions>
        <exclusion>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-base</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.7.0</version>
</dependency>

这些方法中的任何一种都应该有效。

当您在更改版本时未声明所有依赖项时,会发生什么情况,即可以传递旧版本的 jar,并且较新的版本之一尝试使用该旧版本 jar 中的某些类,最终会得到这些类的错误。

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

如何将 Jersey 与较新版本的 jackson 一起使用 的相关文章

随机推荐

  • 如何使用 Android 从 NFC 标签检测制造商?

    我正在尝试检测 NFC 标签的制造商名称 我找到了制造商代码here 但我只能使用这些 ID 检测 Mifare Ultralight C 标签 Ultralight C 标签 ID 的第一个字节代表制造商代码 但其他标签不包含此属性 Th
  • Typescript:通用类型“提取具有 X 类型值的键”的行为不符合预期

    我定义了以下泛型类型 它从类型 T 中提取值为数字的字符串键 type StringKeysMatchingNumber
  • href="tel:" 和手机号码

    如果我使用tel 我应该写国际电话代码 就像这样 a href 61709 a 到目前为止 一切都很好 但我找不到有关如何以 国际 方式书写手机号码的信息 如果有的话 拨打您所在国家 地区的号码时 您仍然需要拨打国内长途电话号码在其余数字之
  • 使用 Xampp 运行 Python 脚本

    我正在使用 python 2 7 13首先 浏览器显示原始代码 我做了什么 编辑httpd conf AddHandler cgi script cgi pl asp py 在我所有脚本的顶部我添加了以下内容 j Installeds Py
  • C# 和 LINQ:按嵌套查询的值对查询进行排序

    我正在 ASP NET 中编写一个简单的论坛 该论坛位于 C 的实体框架数据库之上 Each Topic对象具有导航属性Posts指向一个集合Post对象 每个Post对象有一个属性When这表明该帖子的发布时间 Post Parent是类
  • 如何防止winforms设计器将Text属性设置为实例名称

    在开始之前 似乎以前可能有人问过类似 相同的问题here 然而没有明确的答案 假设我有一个自定义 winforms 控件 它覆盖Text财产 public class MyControl Control DefaultValue publi
  • 使用 ASP.NET 表单身份验证的 WCF 服务

    我正在通过 jQuery ajax 从 ASP NET 页面调用 WCF Web 服务 NET 4 0 如何保护 WCF 服务的安全 以便只有经过身份验证的 ASP NET 用户才能调用该服务的方法 我是否需要在每个服务方法中强制手动检查表
  • Google AppEngine ImportError:动态模块未定义 init 函数 (init_mysql)

    当我在 Google AppEngine 上使用 Flask 部署 python 应用程序时 出现此错误 如果有人帮助我 我将不胜感激 ps 我的本地服务器工作得很好 File base data home apps s dwnup 997
  • 如何在 php 中获取会话 ID 或用户名?

    我有一个用户可以登录的网站 我尝试过
  • 带扩展名的 TypeScript 导入

    您可能听说过 Deno 它是一个新的 TypeScript 运行时 Deno 和普通 TypeScript 之间的一个主要区别是您必须在 import 语句中包含文件扩展名 例如 import foo from bar ts 我想编写与 D
  • css resize 属性 - 更改调整大小图标属性

    我有一个带有 调整大小 属性的 div 默认情况下 您只能通过拖动窗口的右下角来更改大小 我想知道是否有可能改变它的行为 例如它的外貌 size or position 具体来说 我想做的是允许用户在边缘 而不是角落 重新调整窗口的大小 类
  • mongo $slice查询反向索引超出范围

    mongo 中的以下查询表现得很奇怪 db items findOne List slice skip 3 第一的 它不是仅返回一个带有 id List 键的对象 而是返回一个完整的对象 第二 如果skip是负数并且 skip 高于 lis
  • Numpy 创建一个空的 alpha 图像

    我想创建一个空白的 alpha 图像来解析 py opencv 中的一些数据并将其保存在透明背景 png 文件中 我试过 blank image np zeros H W 4 np uint8 and blank image np full
  • 在异步方法中绑定到输出 Blob 时,将 Blob 绑定到 IAsyncCollector 时出错

    我正在尝试在这篇文章之后的异步方法中绑定到 blob 输出 如何将输出值绑定到我的异步 Azure Functions 我有多个输出绑定 因此仅返回不是一个选择 public static async Task
  • 在脚本中设置数字变量(“set $i 1”)不起作用(“echo $i”为空)

    正如标题所说 我需要一个 bash 脚本的帮助 该脚本必须在给定两个数字变量的情况下生成一个字符串 该字符串将用于生成文件名 但是当我测试名称生成代码时 它不会产生任何结果 脚本是下面的代码 usr bin set nombre decla
  • 以编程方式将数据源绑定到报表服务器中的 rdl - SSRS

    我已经完成了一个 ASP NET 应用程序来生成特定数据的报告 最初 我创建了本地报告 rdlc 来生成报告 我为每个 rdlc 创建了单独的 xsd 并设计了报告 我以编程方式构建数据集并将其绑定到 rdlc 我使用以下代码将数据源绑定到
  • 关联引用是如何实现的?

    我在这里看到了一个非常好的示例 子类 UIButton 添加属性 它是什么 您无法将对象添加到类别 但现在有了这个技巧你就可以了 那么它是什么 它是如何工作的 Objective c 对象已经有一些恒定数量的 ivar 指针 对吗 现在你再
  • 根元素带有 ngRepeat 的指令并替换:true

    有人可以解释以下行为背后的根本原因吗 如果指令具有隔离范围scope 有一个根元素ng repeat AND replace true然后它 破坏 隔离范围 这意味着隔离范围在指令内不可访问 可见 并且指令开始从外部范围接收变量 这是我可以
  • 导入 Geopandas 时遇到的问题

    我正在尝试将 geopandas 从 Anaconda 导入到我的 Jupyter Notebook 中 安装似乎有效 但是当我尝试导入包时出现以下错误 ImportError Traceback most recent call last
  • 如何将 Jersey 与较新版本的 jackson 一起使用

    我正在使用 Jersey 2 23 1 jersey media json jackson 但这与 Jackson 2 5 4 相关 但我需要使用 Jackson 2 6 0 或更新版本 我怎样才能做到这一点 我尝试在我的 pom xml