即使包含 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-provider
。 jersey-media-json-jackson
已经将其引入(但版本不同)。
另一件事是 Glassfish 已经拥有自己的 Jersey 版本和朋友。如果您没有将所有与 Jersey 相关的依赖项标记为 <scope>provided</scope>
,那么您可能会遇到版本冲突。所以你应该让他们都provided
。 Glassfish 4.1 使用 Jersey 2.10.4。如果您需要一些较新版本的功能,我会推荐updating Jersey in Glashfish。
我已经看到了这个问题的一些解决方案,但似乎遵循它们并不能解决我的问题。我正在 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-provider
。 jersey-media-json-jackson
已经将其引入(但版本不同)。
另一件事是 Glassfish 已经拥有自己的 Jersey 版本和朋友。如果您没有将所有与 Jersey 相关的依赖项标记为 <scope>provided</scope>
,那么您可能会遇到版本冲突。所以你应该让他们都provided
。 Glassfish 4.1 使用 Jersey 2.10.4。如果您需要一些较新版本的功能,我会推荐updating Jersey in Glashfish。