我当前正在尝试创建一个rest-webservice,它返回类型为 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转换为数组,如下所示,但这也不起作用。
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实现是Jersey,它是Weblogic 12c附带的。
对此有什么好的解决方案(不使用任何其他库)?
答案 0 :(得分:0)
在生成json类型数据时,需要使用与Json相关的jar才能将Object解析为json形式。
如果它是Maven项目,则将Jackson罐添加到pom.xml中。
添加此依赖项。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.6</version>
</dependency>
或
下载jar并将其添加到类路径。
答案 1 :(得分:0)
您没有提到正在使用哪个JAX-RS框架,但是例如根据Apache CXF documentation,如果您想将Jackson用作JSON Provider,则需要以下依赖关系:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.9.3</version>
</dependency>
然后在您的JAX-RS服务上注册一个Jackson Providers,我想您的情况下是针对POJO的,而不是JAXB bean的(警告:CXF文档中的软件包名称是针对Jackson 1.x的,我替换为Jackson 2.x的):
<jaxrs:providers>
<bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
</jaxrs:providers>
对于Jersey,它将是different dependency。
答案 2 :(得分:0)
虽然在Response对象中返回列表
新类如下:
interface AnInterface<C, T> {
fun doSomething(items: List<T>, vararg value: C?): List<T>
}
然后我按以下方式返回此列表:
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;
}
}
不幸的是,这返回的json比我想要的要大:
return Response.ok(new LongArrayList(theOldLongList))
.build();
如果有人找到更好的解决方案,我会接受它作为对此问题的答案。