在JAX-RS中返回带有响应对象的List <long>时,“找不到MessageBodyWriter”

时间:2018-08-10 13:06:28

标签: java rest jax-rs weblogic response

我当前正在尝试创建一个rest-webservice,它返回类型为 List 的对象。该服务使用 @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转换为数组,如下所示,但这也不起作用。

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附带的。

对此有什么好的解决方案(不使用任何其他库)?

3 个答案:

答案 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();

如果有人找到更好的解决方案,我会接受它作为对此问题的答案。