【问题标题】:Difference JSON ouput within glassfish versionglassfish 版本中的差异 JSON 输出
【发布时间】:2017-07-23 00:17:37
【问题描述】:

使用带有相同代码的 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);
    }

glassfish 3.1.2 的 JSON 输出:

    {
      "Lenovo": [
        {
          "id": "1",
          "series": "X220"
        },
        {
          "id": "12",
          "series": "X230"
        } 
      ]
    }

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;

联想对象:

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

    }

我尝试使用 GLassfish 的 Java 平台 JDK 1.6、1.7 并得到相同的结果。如何在不同的 Glassfish 版本中使用相同的代码获得相同的 JSON 结果输出。谢谢。

【问题讨论】:

  • 对我来说看起来不像是有效的 json。无论如何,请发布Lenovo 课程。
  • @MouseEvent 我已经发布了Lenovo Class,相同的代码在不同的GF 中尝试得到不同的结果。
  • 仅供参考,后一个 json 是正确的。可能更正了早期版本中的一个错误。
  • 如果你真的想要前者,你可以定义一个只保存数组列表的包装类(当然它也应该有正确的 jaxb 注释)并返回它。

标签: java json jersey glassfish


【解决方案1】:

这是因为他们使用不同的序列化程序。 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,如果你想要异常映射器,JsonMappingExceptionMapperJsonParseExceptionMapper

您需要做的最后一件事是在 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;
    }
}

【讨论】:

    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 2018-05-02
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多