将Jersey更新为2.22.2时,MessageBodyProviderNotFoundException

时间:2016-03-14 16:06:53

标签: java jersey jax-rs jersey-2.0

我有一个使用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>

1 个答案:

答案 0 :(得分:1)

你需要的不仅仅是Jackson(核心),它只是一个序列化框架,但是没有提供绑定到Jersey框架的任何机制。对于序列化,Jersey使用MessageBodyReaderMessageBodyWriter s。杰克逊模块采用核心杰克逊并使用它为JAX-RS创建MessageBodyReaderMessageBodyWriter 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>