即使包含Jackson,也找不到媒体类型= application / json的MessageBodyWriter

时间:2016-01-27 01:56:02

标签: jax-rs jersey-2.0 glassfish-4

我已经看到了这个问题的一些解决方案,但似乎跟着他们并没有解决我的问题。我返回一个简单的字符串数组,当我返回它时,我收到此错误:

Severe:   MessageBodyWriter not found for media type=application/json, type=class [Ljava.lang.String;, genericType=class [Ljava.lang.String;.

该方法非常简单(获取文件列表)

   @GET
   @Produces(MediaType.APPLICATION_JSON)
   public String[] getSegments(@PathParam("userId") String userId,
           @PathParam("deviceId") String deviceId) {
       System.out.println("in get, userId passed: " + userId);
       String[] segments = storage.getSegments(userId, deviceId);  
       return segments;
   }

我的POM.XML似乎有其他帖子推荐的所有内容:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>RoverServerLib</artifactId>
        <version>${project.version}</version>
    </dependency>

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

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-servlet-portability</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.connectors</groupId>
        <artifactId>jersey-apache-connector</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>${jersey.version}</version>
        <type>jar</type>
    </dependency>
    <dependency>
       <groupId>org.glassfish.jersey.media</groupId>
       <artifactId>jersey-media-moxy</artifactId>
       <version>${jersey.version}</version>
   </dependency>
</dependencies>

1 个答案:

答案 0 :(得分:1)

问题在于MOXy。它不知道如何处理String数组。当您在类路径上使用MOXy时,它将用作默认值。使用杰克逊(jersey-media-json-jackson)。您只需注册JacksonFeature即可。这将禁用MOXy。请注意,即使只是从项目中删除MOXy,也不会像Glassfish那样有影响,因此您需要确保注册JacksonFeature

你也应该摆脱jackson-jaxrs-json-providerjersey-media-json-jackson已经将其拉入(但版本不同)。

另一件事是Glassfish已经拥有它自己的泽西和朋友版本。如果您没有将与泽西岛相关的所有依赖关系标记为<scope>provided</scope>,那么您可能会遇到版本冲突。所以你应该把它们全部provided。 Glassfish 4.1使用Jersey 2.10.4。如果您需要一些较新的版本功能,我建议updating Jersey in Glashfish