0

在 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 文档中,我们有:

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

回到家后,我一定会尝试这种方法。

4

1 回答 1

0

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

   <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>${resteasy.version}</version>
        <scope>provided</scope>
   </dependency>
于 2012-07-21T01:18:00.597 回答