"MessageBodyWriter not found" 当返回带有 JAX-RS 中的 Response-object 的 List<Long> 时
"MessageBodyWriter not found" when returning List<Long> with the Response-object in JAX-RS
我目前正在尝试创建一个 returns 类型为 List 的 rest-webservice。该服务用 @Produces(MediaType.APPLICATION_JSON).
注释
我对这个项目中的其他服务没有任何问题。
如果我这样写代码:
List<Long> list = new ArrayList<Long>();
list.add(100L);
list.add(200L);
list.add(300L);
return Response.ok(list)
.build();
然后我在日志中收到以下消息:
MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList.
如果我改为如下编写(与我对项目中的另一个服务所做的相同,但它是一个 pojo 对象列表):
List<Long> list = new ArrayList<Long>();
list.add(100L);
list.add(200L);
list.add(300L);
GenericEntity<List<Long>> genericEntity = new GenericEntity<List<Long>>(list){};
return Response.ok(genericEntity)
.build();
然后我收到以下消息:
MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=java.util.List<java.lang.Long>.
谷歌搜索后,我发现了以下将列表转换为数组的建议,如下所示,但这也不起作用。
List<Long> list = new ArrayList<Long>();
list.add(100L);
list.add(200L);
list.add(300L);
return Response.ok(list.toArray()).build();
然后我得到:
MessageBodyWriter not found for media type=application/json, type=class [Ljava.lang.Object;, genericType=class [Ljava.lang.Object;.
我们使用的是 jackson-core 版本 2.3.2,jax-rs 实现是 Weblogic 12c 中包含的 Jersey。
对此有什么好的解决方案(不使用任何其他库)?
当您生成 json 类型的数据时,需要 Json 相关的 jar 来将对象解析为 json 形式。
将 Jackson jar 添加到您的 pom.xml 如果它是 Maven 项目。
添加这个依赖..
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
或者
下载 jar 并将其添加到 class 路径。
你没有提到你正在使用哪个 JAX-RS 框架,但是根据 Apache CXF documentation 例如,如果你想使用 Jackson 作为 JSON 提供者,你需要这个依赖项:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.9.3</version>
</dependency>
然后在您的 JAX-RS 服务上注册一个 Jackson 提供者,我猜您的情况是 POJO,而不是 JAXB bean(警告:CXF 文档中的包名称是 Jackson 1.x, 我用 Jackson 2.x):
替换了那个
<jaxrs:providers>
<bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
</jaxrs:providers>
对于泽西岛,它将是 different dependency。
虽然 return在 Response 对象中加入 List< Long> 对我不起作用,但我设法通过将列表嵌入新的 class.
新的 class 如下所示:
public class LongArrayList {
private List<Long> list;
public LongArrayList() {
}
public LongArrayList(List<Long> list) {
this.setList(list);
}
public List<Long> getList() {
return list;
}
public void setList(List<Long> list) {
this.list = list;
}
}
然后我return这个列表如下:
return Response.ok(new LongArrayList(theOldLongList))
.build();
不幸的是,这个 return 比我想要的 json 大一点:
{"list":[5,12,29,30]}
如果有人找到更好的解决方案,我会接受它作为这个问题的答案。
我目前正在尝试创建一个 returns 类型为 List
我对这个项目中的其他服务没有任何问题。
如果我这样写代码:
List<Long> list = new ArrayList<Long>();
list.add(100L);
list.add(200L);
list.add(300L);
return Response.ok(list)
.build();
然后我在日志中收到以下消息:
MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList.
如果我改为如下编写(与我对项目中的另一个服务所做的相同,但它是一个 pojo 对象列表):
List<Long> list = new ArrayList<Long>();
list.add(100L);
list.add(200L);
list.add(300L);
GenericEntity<List<Long>> genericEntity = new GenericEntity<List<Long>>(list){};
return Response.ok(genericEntity)
.build();
然后我收到以下消息:
MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=java.util.List<java.lang.Long>.
谷歌搜索后,我发现了以下将列表转换为数组的建议,如下所示,但这也不起作用。
List<Long> list = new ArrayList<Long>();
list.add(100L);
list.add(200L);
list.add(300L);
return Response.ok(list.toArray()).build();
然后我得到:
MessageBodyWriter not found for media type=application/json, type=class [Ljava.lang.Object;, genericType=class [Ljava.lang.Object;.
我们使用的是 jackson-core 版本 2.3.2,jax-rs 实现是 Weblogic 12c 中包含的 Jersey。
对此有什么好的解决方案(不使用任何其他库)?
当您生成 json 类型的数据时,需要 Json 相关的 jar 来将对象解析为 json 形式。
将 Jackson jar 添加到您的 pom.xml 如果它是 Maven 项目。
添加这个依赖..
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
或者
下载 jar 并将其添加到 class 路径。
你没有提到你正在使用哪个 JAX-RS 框架,但是根据 Apache CXF documentation 例如,如果你想使用 Jackson 作为 JSON 提供者,你需要这个依赖项:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.9.3</version>
</dependency>
然后在您的 JAX-RS 服务上注册一个 Jackson 提供者,我猜您的情况是 POJO,而不是 JAXB bean(警告:CXF 文档中的包名称是 Jackson 1.x, 我用 Jackson 2.x):
替换了那个<jaxrs:providers>
<bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
</jaxrs:providers>
对于泽西岛,它将是 different dependency。
虽然 return在 Response 对象中加入 List< Long> 对我不起作用,但我设法通过将列表嵌入新的 class.
新的 class 如下所示:
public class LongArrayList {
private List<Long> list;
public LongArrayList() {
}
public LongArrayList(List<Long> list) {
this.setList(list);
}
public List<Long> getList() {
return list;
}
public void setList(List<Long> list) {
this.list = list;
}
}
然后我return这个列表如下:
return Response.ok(new LongArrayList(theOldLongList))
.build();
不幸的是,这个 return 比我想要的 json 大一点:
{"list":[5,12,29,30]}
如果有人找到更好的解决方案,我会接受它作为这个问题的答案。