首页 文章

如何从Rest调用返回List <String>

提问于
浏览
2

我试图在几种不同的媒体类型中返回一个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 回答

  • 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;
        }
    }
    
  • 0

    您可以使用“响应”,但必须将列表作为实体传递,以便响应构建器可以正确地形成响应 . 在你的代码中,你委托你的列表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"})
    

相关问题