glassfish 版本中的差异 JSON 输出
Difference JSON ouput within glassfish version
使用具有相同代码的 Jersey 并在 Glassfish 3.1.2 和 4.1.2 中进行测试有不同的结果输出。这是代码:
@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);
}
JSON glassfish 3.1.2 的输出:
{
"Lenovo": [
{
"id": "1",
"series": "X220"
},
{
"id": "12",
"series": "X230"
}
]
}
JSON Glassfish 4.1.2 的输出:
[
{
"id": "1",
"series": "x220"
},
{
"id": "2",
"series": "x230"
}
]
从数据库和 return 对象获取数据。
ArrayList<Agama> rtn = new ArrayList<Lenovo>();
ResultSet rs = stmt.executeQuery(sql.toString());
while (rs.next()) {
rtn.add(new Lenovo(rs));
}
return rtn;
联想对象:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(namespace="Lenovo")
@XmlType(name = "Lenovo", propOrder = {
"id",
"series"
})
public class Lenovo extends DBBase {
int id;
String series;
private void setValues(ResultSet rs) {
try {
id = rs.getInt("id");
series = rs.getString("series");
} catch (SQLException ex) {
ErisHelper.logger.error("Err>" + ex.getMessage(), ex);
}
}
}
我尝试使用 java 平台 JDK 1.6、1.7 和 GLassfish,得到了相同的结果。如何在不同的 Glassfish 版本中使用相同的代码获得相同的 JSON 结果输出。谢谢。
这是因为他们使用了不同的序列化程序。 Glassfish 3 正在使用一些内部序列化程序。您可以将其配置为使用 Jackson 1,只需 web.xml 配置开关,但 Glassfish 4 默认仍使用 MOXy 作为其序列化程序。
如果您想要相同的行为,最好的办法是只使用相同的序列化程序。您可以添加以下 (Jackson 2) 依赖项
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.5</version>
</dependency>
如果您使用 web.xml 进行配置,则只需使用包扫描来获取提供程序。
在 Glassfish 3 中
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.fasterxml.jackson.jaxrs.json</param-value>
</init-param>
在 Glassfish 4 中
<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>
如果您不使用 web.xml,即。您正在使用 Application
子类,您应该注册 JacksonJaxbJsonProvider
,如果您想要异常映射器,JsonMappingExceptionMapper
、JsonParseExceptionMapper
.
您需要做的最后一件事是在 Glassfish 4 中禁用 MOXy。为此,您只需设置 属性。在 web.xml 你可以做
<init-param>
<param-name>jersey.config.disableMoxyJson</param-name>
<param-value>true</param-value>
</init-param>
如果您使用的是 Application
子类,您可以执行
class MyApplication extends Application {
@Override
public Map<String, String> getProperties() {
Map<String, String> props = new HashMap<>();
props.put("jersey.config.disableMoxyJson", "true");
return props;
}
}
使用具有相同代码的 Jersey 并在 Glassfish 3.1.2 和 4.1.2 中进行测试有不同的结果输出。这是代码:
@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);
}
JSON glassfish 3.1.2 的输出:
{
"Lenovo": [
{
"id": "1",
"series": "X220"
},
{
"id": "12",
"series": "X230"
}
]
}
JSON Glassfish 4.1.2 的输出:
[
{
"id": "1",
"series": "x220"
},
{
"id": "2",
"series": "x230"
}
]
从数据库和 return 对象获取数据。
ArrayList<Agama> rtn = new ArrayList<Lenovo>();
ResultSet rs = stmt.executeQuery(sql.toString());
while (rs.next()) {
rtn.add(new Lenovo(rs));
}
return rtn;
联想对象:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(namespace="Lenovo")
@XmlType(name = "Lenovo", propOrder = {
"id",
"series"
})
public class Lenovo extends DBBase {
int id;
String series;
private void setValues(ResultSet rs) {
try {
id = rs.getInt("id");
series = rs.getString("series");
} catch (SQLException ex) {
ErisHelper.logger.error("Err>" + ex.getMessage(), ex);
}
}
}
我尝试使用 java 平台 JDK 1.6、1.7 和 GLassfish,得到了相同的结果。如何在不同的 Glassfish 版本中使用相同的代码获得相同的 JSON 结果输出。谢谢。
这是因为他们使用了不同的序列化程序。 Glassfish 3 正在使用一些内部序列化程序。您可以将其配置为使用 Jackson 1,只需 web.xml 配置开关,但 Glassfish 4 默认仍使用 MOXy 作为其序列化程序。
如果您想要相同的行为,最好的办法是只使用相同的序列化程序。您可以添加以下 (Jackson 2) 依赖项
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.5</version>
</dependency>
如果您使用 web.xml 进行配置,则只需使用包扫描来获取提供程序。
在 Glassfish 3 中
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.fasterxml.jackson.jaxrs.json</param-value>
</init-param>
在 Glassfish 4 中
<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>
如果您不使用 web.xml,即。您正在使用 Application
子类,您应该注册 JacksonJaxbJsonProvider
,如果您想要异常映射器,JsonMappingExceptionMapper
、JsonParseExceptionMapper
.
您需要做的最后一件事是在 Glassfish 4 中禁用 MOXy。为此,您只需设置 属性。在 web.xml 你可以做
<init-param>
<param-name>jersey.config.disableMoxyJson</param-name>
<param-value>true</param-value>
</init-param>
如果您使用的是 Application
子类,您可以执行
class MyApplication extends Application {
@Override
public Map<String, String> getProperties() {
Map<String, String> props = new HashMap<>();
props.put("jersey.config.disableMoxyJson", "true");
return props;
}
}