我有一个使用Jersey 2.8的应用程序,我正在尝试升级到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 Boot,这是我的配置类:
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>
答案 0 :(得分:1)
你需要的不仅仅是Jackson(核心),它只是一个序列化框架,但是没有提供绑定到Jersey框架的任何机制。对于序列化,Jersey使用MessageBodyReader
和MessageBodyWriter
s。杰克逊模块采用核心杰克逊并使用它为JAX-RS创建MessageBodyReader
和MessageBodyWriter
JSON
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${jackson2.version}</version>
</dependency>
Jersey有一个模块可以为该库添加更多内容,并进行一些自动注册。那个神器是
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version>
</dependency>
如果您正在使用泽西岛,那么您应该使用这个。添加后,您无需执行任何其他操作。它会自动注册Jackson提供商
请注意,jersey-media-json-jackson
会提取所有必需的杰克逊图书馆,但它不会是杰克逊的最新版本。对于Jersey 2.22.2,我认为Jackson版本是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>