如何从Rest调用</string>返回List <string>

时间:2014-04-04 18:10:21

标签: java json rest java-ee glassfish

我试图在几种不同的媒体类型中返回一个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方法,如果这是正确的方法,但似乎另一种方式应该有效。

2 个答案:

答案 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})