如何使用更新版本的杰克逊泽西 [英] How to use Jersey with a newer version of jackson

查看:111
本文介绍了如何使用更新版本的杰克逊泽西的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Jersey(2.23.1)和 jersey-media-json-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>

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

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

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



但我的其他应用程序会抛出各种 NoSuchMethodError ClassNotFoundExceptions ,如:

  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或更新版本一起使用? TIA!



更新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;)org.glassfish.jersey.servlet.WebComponent.serviceImpl的V 
(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 )
引起:org.glassfish.jersey.server.ContainerException:java.lang.NoSuchMethodError:com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase。< init>(Lcom / fasterxml / jackson / databind / cfg / MapperConfig;)V
org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:278)
at org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter .java:260)
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)
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个常见框架省略
引起: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.jack son.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.aroundReadF rom(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)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:94)
at org.glassfish.jersey。 server.model.internal.JavaResourceMethodDispatcherProvider $ AbstractMethodPa ramInvoker.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个常见帧

更新2



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

 注册(JacksonFeat ure.class); 
寄存器(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>

如果您想使用新版本,您可以选择几种方式。您可以使用所需的版本在pom.xml文件中显式声明所有,或者排除所有依赖项,并且只显式声明主要的。



对于明确声明的选项,您可以只使用上述三个,指定所需的版本。显式声明优先于传递依赖关系。因此,明确宣布的那些将永远是被拉入的那些,而不是泽西岛所引入的那些。



对于排除的选项,你可以将它们排除在 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>
< dependency>
< 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中的某些类,并最终得到这些错误。


I am using Jersey (2.23.1) with jersey-media-json-jackson. But that is linked against Jackson 2.5.4. But I need to use Jackson 2.6.0 (or a newer version).

How can I do this?

I tried to set it in my 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>

Then jackson 2.6.0 is used. (I have also tried newer versions.)

But my rest application throws various 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;)

Is there any way to use Jersey 2.23.1 with Jackson 2.6.0 or newer? TIA!

Update 1:

Here is a full stack trace:

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

Here is how I enable jackson for jersey:

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

解决方案

When you want to override a version, you need to look at the pom.xml of the module. You see in the link that there are three Jackson dependencies explicitly declared

<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>

When you want to use a new version, you have a couple options to go about it. You can explicitly declare all of them in your pom.xml file with the version you want, or you can exclude all the dependencies, and just explicitly declare the main one.

For the option of explicitly declaring, you can just all the three above, specifying the version you want. Explicit declarations take precedence over transitive dependencies. So the explicitly declared ones will always be the ones pulled in, rather than the ones pulled in by Jersey.

For the option of excluding, you can exclude them from from the jersey-media-json-jackson, and just add the main one the pulls everything else in. In this case jackson-jaxrs-json-provider pulls the other two in, so you really only need to declare that one

<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>
        <dependency>
            <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>

Either one of these ways should work.

What happens when you don't declare all dependencies when changing version, is that an older version jar can be pulled in transitively, and one of the newer versions tries to use some classes in that older version jar, and you end up with these kind of errors.

这篇关于如何使用更新版本的杰克逊泽西的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆