我试图在几种不同的媒体类型中返回一个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,type = class的MessageBodyWriter java.util.Arrays中的$ ArrayList中, genericType = java.util.List中。
我原以为玻璃鱼可以在这里弄清楚如何处理基本的集合类。当我试图将它们解析成json时,他们默默地失败了,显然没有消息作者将它们变成字符串。我错过了一些明显的东西吗?
更新 我使用以下说明将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方法,如果这是正确的方法,但似乎另一种方式应该有效。
答案 0 :(得分:4)
您必须为Jersey(Glassfish中的JAX-RS实现)启用JSON支持。 在这里您可以找到详细信息:
顺便说一下,在添加 jersey-media-json-jackson 依赖项后,这个最小配置对我来说已经足够了:
@ApplicationPath("/rest")
public class App extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<>();
// enable JSON support through Jackson
classes.add(JacksonFeature.class);
// my rest service
classes.add(MyRESTService.class);
return classes;
}
}
答案 1 :(得分:0)
您可以使用“ Response”,但必须将列表作为实体传递,这样响应构建器才能正确构建响应。在您的代码中,将不知道ArrayList意味着什么的ok()方法委托给列表,因此在您的代码中只需添加如下所示的实体:
() => console.log("I Was Clicked!!!")
注意:实体方法可以映射许多MediaType,这意味着您可以使用此方法:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getSessions(){
Response r = Response.ok().entity(Arrays.asList("foo","bar")).build();
return r;
}
,或者即使您使用自己的自定义MediaType,它也可以做到:
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})