我试图在几种不同的媒体类型中返回一个List . 我在glassfish 4上主持这个 .
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public List<String> getSessions(){
return Arrays.asList("foo","bar");
}
如果我在没有指定类型的情况下执行普通GET,则会出现500内部服务器错误 . 指定application / json也会给我500个内部服务器错误 . 服务器日志绝对没有错误 .
如果我使用Accept:text / plain进行GET,我会得到以下结果:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到媒体类型= text / plain的MessageBodyWriter,type = class java.util.Arrays $ ArrayList,genericType = java.util.List .
我原以为玻璃鱼可以在这里弄清楚如何处理基本的集合类 . 当我试图将它们解析成json并且显然没有一个messagebodywriter将它们变成字符串时,它们会默默地失败 . 我错过了一些明显的东西吗
Update 我使用以下说明添加了Jackson作为jaxrs json提供程序:https://github.com/FasterXML/jackson-jaxrs-providers
显然,在当前版本中,我不需要专门注册JacksonFeature.class,也不需要,因为没有JacksonFeature类,只有JacksonFeatures接口 .
我将此依赖项添加到我的项目中:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.3.0</version>
</dependency>
我现在能够通过Response对象返回json,如下所示:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getSessions(){
Response r = Response.ok(Arrays.asList("foo","bar")).build();
return r;
}
但是,尝试返回List仍然失败,出现500内部服务器错误,并且没有消息到服务器错误日志 .
如果这是正确的方法,我愿意使用Response方法,但似乎另一种方式应该有效 .
2 回答
您必须为Jersey(Glassfish中的JAX-RS实现)启用JSON支持 . 在这里您可以找到详细信息:
Enable JSON
Use Jackson或use Moxy
顺便说一下,添加jersey-media-json-jackson依赖后,这个最小配置对我来说足够了:
您可以使用“响应”,但必须将列表作为实体传递,以便响应构建器可以正确地形成响应 . 在你的代码中,你委托你的列表ok()方法,它不知道ArrayList的含义,所以在你的代码中只需添加如下实体:
注意:实体方法可以映射许多MediaType,这意味着您可以使用:
或者即使您使用自己定制的MediaType,它也会完成这项工作: