【问题标题】:Return list as json using jersey/spring rest server giving errors?使用 jersey/spring rest server 以 json 形式返回列表给出错误?
【发布时间】:2016-09-02 00:29:32
【问题描述】:

我希望能够在我的回复中添加一个新标题。 我收到错误消息:

org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo 严重:找不到媒体 type=application/json、type=class java.util.ArrayList、genericType=class java.util.ArrayList 的 MessageBodyWriter。

我的代码如下:

@GET
 @Path("/persons")
 @Produces({ MediaType.APPLICATION_JSON })
 public Response getPersons()
 {
    List<Person> persons = new ArrayList<Person>();
    persons.add(new Person(1, "John Smith"));
    persons.add(new Person(2, "Jane Smith"));

 return Response.ok(persons).build();
 }

当我使用“List”作为返回类型并返回“persons”时,返回成功,但是当我返回“Response”时出现错误。我该如何摆脱它?

【问题讨论】:

    标签: java json rest jersey


    【解决方案1】:

    将 Jackson 功能注册到您的 Jersey 配置中。这将自动将 Jackson 入站和出站映射功能添加到 Jersey。

    public class JerseyConfig extends ResourceConfig {
        public JerseyConfig() {
            ...
            register(JacksonFeature.class);
            ...
        }
    

    更多信息请参见https://jersey.java.net/documentation/latest/media.html#json.jackson

    【讨论】:

      【解决方案2】:

      异常告诉您没有MessageBodyWriter 提供程序。基本上,因为MediaType.APPLICATION_JSON,这意味着您需要在您的依赖项中使用一些json框架或@Provider的自定义实现有关提供者1.1 JAX-RS的更多信息(无法在线找到JSR 339规范,可以从here 2.0 JAX-RS下载pdf)

      也许这会为你解决它:

      对于毕业典礼

      compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.22.2'
      

      对于 Maven

      <dependency>
          <groupId>org.glassfish.jersey.media</groupId>
          <artifactId>jersey-media-json-jackson</artifactId>
          <version>2.22.2</version>
      </dependency>
      

      从这里http://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson为您的设置选择合适的版本

      顺便说一句:SO LINKSO LINKSO LINKSO LINK


      @peeskillet 评论后更新。

      很好的一点是,已经有一些 json 关联的提供程序,但由于某种原因它不能用 List 编组响应。我不能说太多,因为我们需要查看您的设置(pom 或 gradle 构建文件),或者您可以尝试使用 https://stackoverflow.com/a/6081716/1032167https://stackoverflow.com/a/35039968/1032167 之类的东西来解决它。


      所以,使用(选项 1)Jackson 或使用(选项 2)

      GenericEntity<List<Person>> entity = new GenericEntity<List<Person>>(persons) {};
      Response.ok(entity).build();
      

      【讨论】:

      • 这应该可行,但您的推理不正确。请参阅问题中 OP 的最后陈述。然后看看this post。似乎 OP 已经有一个提供者,但可能没有使用 Jackson,也许是 MOXy。在这种情况下,仅仅添加 Jackson 是行不通的,他们仍然需要删除 MOXy。
      • @peeskillet 你是绝对正确的。出于某种奇怪的原因,我跳过了 OP 帖子的最后一行。顺便说一句,您提供的链接中有很好的解释
      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多