【发布时间】: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 有什么意义呢?似乎没有必要
-
是的,没错。但这与这个问题的想法无关,不会改变结果。