"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]}

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