繁体   English   中英

如何返回列表 <String> 从休息电话

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM