Java glassfish版本中JSON输出的差异
在Glassfish 3.1.2和4.1.2中使用代码相同的Jersey并进行测试会产生不同的结果输出。代码如下:Java glassfish版本中JSON输出的差异,java,json,jersey,glassfish,Java,Json,Jersey,Glassfish,在Glassfish 3.1.2和4.1.2中使用代码相同的Jersey并进行测试会产生不同的结果输出。代码如下: @GET @Produces(MediaType.APPLICATION_JSON) public ArrayList<Lenovo> getList(@DefaultValue("0") @QueryParam("limit") final int limit, @Defa
@GET
@Produces(MediaType.APPLICATION_JSON)
public ArrayList<Lenovo> getList(@DefaultValue("0") @QueryParam("limit") final int limit,
@DefaultValue("0") @QueryParam("offset") final int offset,
@DefaultValue("0") @QueryParam("id") final int id,
@DefaultValue("") @QueryParam("series") final String series) {
DBBase obj = new Lenovo(id, series);
DBSearch dbs = new DBSearch(limit, offset, obj);
return bl.getList(dbs);
}
Glassfish 4.1.2的JSON输出:
[
{
"id": "1",
"series": "x220"
},
{
"id": "2",
"series": "x230"
}
]
从数据库获取数据并返回对象
ArrayList<Agama> rtn = new ArrayList<Lenovo>();
ResultSet rs = stmt.executeQuery(sql.toString());
while (rs.next()) {
rtn.add(new Lenovo(rs));
}
return rtn;
我曾尝试使用java平台JDK1.6和1.7来同时使用GLassfish,得到了相同的结果。如何在不同的Glassfish版本中使用相同的代码获得相同的JSON结果输出。谢谢。这是因为他们使用不同的序列化程序。GlassFish3正在使用一些内部序列化程序。您可以将它配置为使用Jackson 1,只使用web.xml配置swtich,但Glassfish 4在默认情况下仍使用MOXy作为其序列化程序 如果您想要相同的行为,最好的方法就是使用相同的序列化程序。您可以添加以下(Jackson 2)依赖项
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.5</version>
</dependency>
如果您使用的是应用程序
子类,您可以
<init-param>
<param-name>jersey.config.disableMoxyJson</param-name>
<param-value>true</param-value>
</init-param>
class MyApplication extends Application {
@Override
public Map<String, String> getProperties() {
Map<String, String> props = new HashMap<>();
props.put("jersey.config.disableMoxyJson", "true");
return props;
}
}
类MyApplication扩展了应用程序{
@凌驾
公共映射getProperties(){
Map props=newhashmap();
put(“jersey.config.disableoxyJSON”、“true”);
返回道具;
}
}
在我看来不是有效的json。无论如何,请发布Lenovo
类。@MouseEvent我发布了Lenovo类,相同的代码在不同的GF中尝试得到不同的结果。仅供参考,后一个json是正确的。可能修正了早期版本中的一个bug。如果您真的想要前者,您可以定义一个只保存数组列表的包装器类(当然它也应该有正确的jaxb注释)并返回它。
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.fasterxml.jackson.jaxrs.json</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.fasterxml.jackson.jaxrs.json</param-value>
</init-param>
<param-value>
com.fasterxml.jackson.jaxrs.json,
com.fasterxml.jackson.jaxrs.base <----
</param-value>
<init-param>
<param-name>jersey.config.disableMoxyJson</param-name>
<param-value>true</param-value>
</init-param>
class MyApplication extends Application {
@Override
public Map<String, String> getProperties() {
Map<String, String> props = new HashMap<>();
props.put("jersey.config.disableMoxyJson", "true");
return props;
}
}