[英]How do I return a List<String> from Rest call
我正在尝试以几种不同的媒体类型返回列表。 我将其托管在glassfish 4上。
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
public List<String> getSessions(){
return Arrays.asList("foo","bar");
}
如果我执行普通的GET而未指定类型,则会收到500个内部服务器错误。 指定application / json也会给我500内部服务器错误。 服务器日志显示绝对没有错误。
如果使用“接受:文本/纯文本”进行GET,则会得到以下信息:
org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到针对媒体type = text / plain,type = class java.util.Arrays $ ArrayList,genericType = java.util.List的MessageBodyWriter。
我本以为glassfish可以在这里弄清楚如何使用基本的收集类。 当我尝试将它们解析为json并且显然没有messagebodywriter将它们转换为字符串时,它们默默失败。 我是否缺少明显的东西?
更新我已经按照以下说明将Jackson添加为jaxrs json提供程序: https : //github.com/FasterXML/jackson-jaxrs-providers
显然,在当前版本中,我不需要专门注册JacksonFeature.class,也不需要注册,因为没有Jacksonson功能类,只有JacksonFeatures接口。
我将此依赖项添加到我的项目中:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.3.0</version>
</dependency>
我现在可以通过响应对象返回json,如下所示:
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getSessions(){
Response r = Response.ok(Arrays.asList("foo","bar")).build();
return r;
}
但是,尝试返回List仍然失败,并显示500内部服务器错误,并且没有消息发送到服务器错误日志。
如果这是正确的方法,我愿意使用Response方法,但似乎另一种方法应该可行。
您必须为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;
}
}
您可以使用“ Response”,但必须将列表作为实体传递,这样响应构建器才能正确构建响应。 在您的代码中,将ok()方法委托给您的列表,该方法不知道ArrayList的类型,因此在您的代码中只需添加如下所示的实体:
@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})
甚至即使您使用自己的自定义MediaType,它也可以做到:
@Produces({"application/vnd.myList+json", "application/vnd.myList+xml"})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.