【问题标题】:Difference serializing POJO using RestEasy when deployed with JBoss AS 7 and Jetty与 JBoss AS 7 和 Jetty 一起部署时使用 RestEasy 序列化 POJO 的区别
【发布时间】:2012-07-19 18:33:46
【问题描述】:

在 JBoss AS 7 上部署我的应用程序,然后在 Jetty 上部署,我注意到当 RestEasy 序列化我的 POJO 时出现了不受欢迎的差异。使用 Jetty,我有以下 JSON:

{
"pojo-name":{
    "lines":[
        {
            "code":"250-1",
            "id":1143,
         }]
    }
}

但是,当部署在 JBoss AS 7 上时,@XmlRootElement 注解给出的“pojo-name”会简单地消失,从而导致:

{
"lines":[
    {
        "code":"250-1",
        "id":1143,
    }]
}

我有一个包含以下依赖项的 POM 文件:

  <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jaxrs</artifactId>
      <version>${resteasy.version}</version>
      <scope>provided</scope>
  </dependency>
  <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-jaxb-provider</artifactId>
      <version>${resteasy.version}</version>
      <scope>provided</scope>
  </dependency>
  <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>jaxrs-api</artifactId>
      <version>${resteasy.version}</version>
      <scope>provided</scope>
  </dependency>
  <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-spring</artifactId>
      <version>${resteasy.version}</version>
      <exclusions>
          <exclusion>
              <artifactId>commons-logging</artifactId>
              <groupId>commons-logging</groupId>
          </exclusion>
          <exclusion>
              <artifactId>jaxb-impl</artifactId>
              <groupId>com.sun.xml.bind</groupId>
          </exclusion>
          <exclusion>
              <artifactId>sjsxp</artifactId>
              <groupId>com.sun.xml.stream</groupId>
           </exclusion>
           <exclusion>
              <artifactId>jsr250-api</artifactId>
              <groupId>javax.annotation</groupId>
           </exclusion>
           <exclusion>
              <artifactId>activation</artifactId>
              <groupId>javax.activation</groupId>
           </exclusion>
      </exclusions>
 </dependency>

我的 POJO 类如下所示:

@XmlRootElement(name = "pojo-name")
public class LinesResponse implements Serializable {

    private static final long serialVersionUID = -8717658630497030320L;

    private List<Lines> lines;

    public LinesResponse() {}

    // Getters and setters
}

您的帮助将不胜感激!谢谢各位。


编辑:

我似乎面临着 JAXB 提供者之间可能存在的冲突。也许当我的应用程序使用 Jetty 部署时,我将 Jettison 作为 JAXB 提供者,并且在部署在 JBoss Jackson 上时。来自JBoss documentation 我们有:

如果您的 Jackson 类使用 JAXB 注释进行注释,并且您的类路径中有 resteasy-jaxb-provider,您可能会触发 Jettision JAXB 编组代码。要关闭 JAXB json marshaller,请在您的类上使用 @org.jboss.resteasy.annotations.providers.jaxb.IgnoreMediaTypes("application/*+json")。

一回到家,我就会尝试这种方法来确定。

【问题讨论】:

    标签: java spring jetty jboss7.x resteasy


    【解决方案1】:

    刚刚确认了上述假设。这是 JAXB 提供者之间的冲突。当部署在 JBoss 上时,我的应用程序使用的是 Jackson,而在 Jetty 上它使用的是 Jettison。为了解决这个问题,我强制使用Jackson provider with

       <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson-provider</artifactId>
            <version>${resteasy.version}</version>
            <scope>provided</scope>
       </dependency>
    

    【讨论】:

    • 注意:Jettison 和 Jackson 都不是 JAXB 提供者。然而,两者都用于将部分 JAXB 模型转换为 JSON。
    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    相关资源
    最近更新 更多