2016-03-14 95 views
1

我有一個澤西2.8的工作應用程序,我試圖升級到2.22.2。但是,當我做到這一點,新澤西不斷拋出這些異常:MessageBodyProviderNotFoundException將澤西更新到2.22.2時

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList. 

我甚至手動添加的傑克遜依賴

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

但它並不能幫助。

我使用Spring啓動,這是我的配置類:

public class JerseyConfig extends ResourceConfig { 

    public JerseyConfig() { 
     packages("com.xxxxxx.resource", "com.xxxxx.provider"); 
     register(MultiPartFeature.class); 
     register(LoggingFilter.class); 
     this.property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true); 
     this.property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, true); 
     this.property(ServletProperties.FILTER_FORWARD_ON_404, true); 
    } 

} 

而且我的pom.xml的相關部分:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.glassfish.jersey</groupId> 
      <artifactId>jersey-bom</artifactId> 
      <version>${jersey.version}</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

    <dependency> 
     <groupId>org.glassfish.jersey.ext</groupId> 
     <artifactId>jersey-spring3</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.ext</groupId> 
     <artifactId>jersey-bean-validation</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-multipart</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jsr310</artifactId> 
     <version>2.7.0</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.7.2</version> 
    </dependency> 

回答

1

您需要的不僅僅是傑克遜(核心)更多,它只是一個序列化框架,但是沒有提供任何綁定到Jersey框架的機制。對於序列化,Jersey使用MessageBodyReader s和MessageBodyWriter s。有一個傑克遜模塊,採用核心傑克遜並用它來進行JSON創建一個MessageBodyReaderMessageBodyWriter的JAX-RS

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>${jackson2.version}</version> 
</dependency> 

新澤西州有更多的一些添加到庫中的模塊,並做一些自動註冊。神器是

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>${jersey2.version}</version> 
</dependency> 

這是你應該使用,如果你正在與澤西工作。添加後不需要做任何事情。它會自動註冊傑克遜供應商

請注意,jersey-media-json-jackson需要所有必需的傑克遜庫,但它不會是傑克遜的最新版本。澤西2.22.2,我認爲傑克遜版本是2.5(不是100%肯定)。如果你需要最新的功能,你應該排除所有的Jackson庫,並且在這個答案中加上第一個,包括你想要的版本,以及上面的那個。這些是您應該對「jersey-media-json-jackson」排除的排除條款。

<groupId>com.fasterxml.jackson.jaxrs</groupId> 
<artifactId>jackson-jaxrs-base</artifactId> 

<groupId>com.fasterxml.jackson.jaxrs</groupId> 
<artifactId>jackson-jaxrs-json-provider</artifactId> 

<groupId>com.fasterxml.jackson.core</groupId> 
<artifactId>jackson-annotations</artifactId> 
+0

再次感謝。任何想法爲什麼升級時發生? – user384729

+0

如果您接受POJO參數或返回POJO響應,Jersey需要JSON提供程序來處理序列化,而不僅僅是Jackson核心。如果你用核心Jackson自己序列化它,也就是說你只需要一個String方法參數(然後使用Jackson反序列化)或者在使用Jackson進行序列化後返回一個String,那麼Jersey不需要提供者。它只是發送或接收字符串。這是我能想到的唯一一件事,那就是你的行事方式不同。除此之外,僅僅依賴於你的文章,只是將版本更改爲2.8,我不知道它是如何... –

+0

...將與POJO一起工作。沒有提供者來處理POJO –