2016-06-24 18 views
2

Ich verwende Jersey (2.23.1) mit jersey-media-json-jackson. Aber das ist gegen Jackson 2.5.4 verknüpft. Aber ich muss Jackson 2.6.0 (oder eine neuere Version) verwenden.So verwenden Sie Jersey mit einer neueren Version von Jackson

Wie kann ich das tun?

Ich habe versucht, es in meinem pom.xml zu setzen:

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

Dann wird jackson 2.6.0 verwendet. (Ich habe auch versucht, neuere Versionen.)

Aber meine Ruhe Anwendung wirft verschiedene NoSuchMethodError oder ClassNotFoundExceptions, wie:

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

Gibt es eine Möglichkeit Jersey zu verwenden 2.23.1 mit Jackson 2.6.0 oder höher? TIA!

Update 1:

Hier ist ein 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

Hier ist, wie ich jackson für Jersey aktivieren:

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

Antwort

7

W Wenn Sie eine Version überschreiben möchten, müssen Sie sich die pom.xml des Moduls ansehen. Sie sehen in der Verbindung, dass es drei Jackson Abhängigkeiten

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

Wenn Sie eine neue Version verwenden, haben Sie ein paar Optionen, darüber zu gehen. Sie können alle von ihnen in Ihrer pom.xml-Datei mit der gewünschten Version explizit deklarieren, oder Sie können alle Abhängigkeiten ausschließen und nur explizit die wichtigste deklarieren.

Für die Möglichkeit, explizit zu deklarieren, können Sie nur alle drei oben, unter Angabe der gewünschten Version. Explizite Deklarationen haben Vorrang vor transitiven Abhängigkeiten. Also werden immer die explizit deklarierten diejenigen sein, die von Jersey gezogen werden.

Für die Option auszuschließen, können Sie sie von der jersey-media-json-jackson ausschließen, und fügen Sie einfach die wichtigste die zieht alles andere ein. In diesem Fall jackson-jaxrs-json-provider zieht die anderen beiden in, so dass Sie wirklich nur diese zu deklarieren

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

Entweder einer dieser Wege sollte funktionieren.

Was passiert, wenn Sie nicht alle Abhängigkeiten beim Ändern der Version deklarieren, ist, dass eine ältere Version jar transitiv gezogen werden kann, und eine der neueren Versionen versucht, einige Klassen in dieser älteren Version jar zu verwenden, und Sie beenden mit dieser Art von Fehlern.

+0

Ich benutzte Eclipse, um jede Jackson-Abhängigkeit auszuschließen, aber ich bekomme immer noch die oben genannten Fehler. Ich nehme an, dass jackson api nicht abwärtskompatibel ist. – t777

+0

Es ist möglich, aber ich habe eine neuere Version vor mir selbst verwendet, und es war kein Problem –

+0

Haben Sie einen vollen Stack-Trace, den Sie posten können? –