【发布时间】:2018-08-10 13:06:28
【问题描述】:
我目前正在尝试创建一个返回 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 实现是 Jersey,它包含在 Weblogic 12c 中。
有什么好的解决方案(不使用任何其他库)?
【问题讨论】:
-
如果您使用 JAX-RS 并希望将结果作为
List<Long>返回,我相信您只返回List<Long>本身,而不是包裹在Response中。 JAX-RS 将负责将其编组为请求的类型。 -
是的,这是真的。但我也想在响应消息中返回一个标题。如果服务器端出现问题,我将返回带有相应 http 状态代码的错误消息。
-
那么你只需抛出一个用适当的错误代码构造的
WebApplicationException(使用Response.Status定义的状态代码常量)。让 JAX-RS 为您完成工作。 -
感谢您的评论!似乎我今天学到了一些新东西(WebApplicationException)。但我仍然需要能够在响应中添加标头,包括正确响应和错误响应。
-
您使用的是哪个 JAX-RS 框架?
标签: java rest jax-rs weblogic response