与JBoss AS 7和Jetty一起部署时,使用RestEasy序列化POJO的差异



在JBoss AS 7和Jetty上部署我的应用程序时,我注意到RestEasy序列化我的POJO时出现了不希望有的差异。使用Jetty,我得到了以下JSON:

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

然而,当部署在JBoss AS 7上时,@XmlRootElement注释给出的"pojo名称"会消失,结果是:

{
"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提供程序,那么您可能会触发Jetvision JAXB编组代码。要关闭JAXB json整理器,请在类上使用@org.jboss.reestasy.annotations.provider.JAXB.IgnoreMediaTypes("application/*+json")。

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

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

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

最新更新