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

MessageBodyWriter not found for media type=application/json even while Jackson is included

我已经看到了这个问题的一些解决方案,但似乎遵循它们并不能解决我的问题。我正在 return 创建一个简单的字符串数组,当我 return 它时,出现此错误:

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>

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

你也应该去掉 jackson-jaxrs-json-providerjersey-media-json-jackson 已经将其引入(但版本不同)。

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