Разница в сериализации POJO с использованием RestEasy при развертывании с JBoss AS 7 и Jetty

Развертывая свое приложение на JBoss AS 7, а затем на Jetty, я заметил нежелательную разницу, когда RestEasy сериализовал мой POJO. С Jetty у меня есть следующий JSON:

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

Однако при развертывании на JBoss AS 7 "pojo-name", заданное аннотацией @XmlRootElement, просто исчезает, в результате чего:

{
"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") в ваших классах.

Как только я вернусь домой, я попробую этот подход, чтобы быть уверенным.


person Trein    schedule 20.07.2012    source источник


Ответы (1)


Только что подтвердил предположения, описанные выше. Это был конфликт между поставщиками JAXB. При развертывании на JBoss мое приложение использовало Jackson, а на Jetty - Jettison. Чтобы решить эту проблему, я заставил использовать провайдера Джексона с

   <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>${resteasy.version}</version>
        <scope>provided</scope>
   </dependency>
person Trein    schedule 21.07.2012
comment
Примечание. Ни Jettison, ни Jackson не являются поставщиками JAXB. Однако оба используются при преобразовании частей моделей JAXB в JSON. - person bdoughan; 23.07.2012