【问题标题】:Jersey rest server - Return list as jsonJersey 休息服务器 - 以 json 形式返回列表
【发布时间】:2015-03-12 08:02:00
【问题描述】:

在 Tomcat 和 Glassfish 上运行时,运行相同代码的返回列表的 json 结构有所不同。

@XmlRootElement
public Class Person {
    private int personId;
    private String name;
}

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

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

如果在 tomcat 上以 json 格式返回(我在本地机器上运行 Tomcat),结果将是:

[
    {
        "personId" : "1",
        "name" : "John Smith"
    },
    {
        "personId" : "2",
        "name" : "Jane Smith"
    }
]

如果在 Glassfish 上以 json 格式返回(在远程服务器上运行 Glassfish),结果将是:

{
    "person" : 
    [
        {
            "personId" : "1",
            "name" : "John Smith"
        },
        {
            "personId" : "2",
            "name" : "Jane Smith"
        }
    ]
}

我怎样才能自己控制这种格式?如果可能的话,我更喜欢数组格式(如在 Tomcat 上)。无论哪种方式,我都希望它产生相同的结果。

编辑:

依赖: jersey-container-servlet (2.14), 球衣服务器(2.14), jersey-media-moxy (2.14), javax.servlet-api (3.0.1)

Glassfish 版本:3.1.2.2(内部版本 5)

编辑 2: 这是 Jersey 2.14 和 Glassfish 3.x 的问题

我刚刚安装了 Glassfish 3 和 4 并部署了其余应用程序来检查响应。返回列表时会导致不同的 json 结构。 Glassfish 4 的响应与我在 Tomcat 上运行时得到的结果相同。

【问题讨论】:

  • 您是否尝试过不使用GenericEntity 直接从List 构建Response
  • 我已经尝试过了,但它不起作用:严重:MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList .
  • 请发布您的依赖项以及您正在使用的 Glassfish。
  • 那么使用 List.newArrayList 有什么意义呢?似乎没有必要
  • 是的,没错。但这与这个问题的想法无关,不会改变结果。

标签: java json rest jersey


【解决方案1】:

尝试添加响应媒体类型注释并尝试使用 List 而不是 GenericEntity,如下所示:

 @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();
 }

【讨论】:

  • 我在包含 getPersons 的类上有 @Produces 注释,如下所示:@Produces( { "application/json;qs=1", "application/xml;qs=.5" } ) 所以不是这样。同样返回 List 会导致错误:严重:MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList。
  • 然后尝试返回一个 List 对象。 public List&lt;Person&gt; getPersons() { 并仅返回 return persons; 如果您还没有 JAXB 的 Person 类,您可能还需要一个非参数构造函数。
  • 那么我将无法返回另一个对象以防万一出现问题。如果出现问题,我会返回一个包含错误消息的 Message 对象。
  • 也许这会对Link BTW 有所帮助。如果出现问题,您总是可以抛出异常。检查 these 扩展 WebApplicationException 的所有内容。
  • 好的,我想我会尝试一个解决方案,我返回 List 并创建我自己的从 WebApplicationException 扩展的异常以返回一个 Message 对象
猜你喜欢
  • 1970-01-01
  • 2016-05-18
  • 2019-03-26
  • 2016-09-02
  • 2013-10-23
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多