Пользовательское отображение JAX-RS из сущностей в xml - PullRequest
1 голос
/ 09 июля 2010

Вот моя проблема:

Скажем, у меня есть две сущности, аннотированные аннотациями JAX-RS:

@XmlRootElement
@Entity
public Person {
  private String firstname;
  private String lastname;

  private Address address;
}

@XmlType
@Entity
public Address {
  private String street;
  private String city;
}

Это будет преобразовано в:

<person>
  <firstname></firstname>
  <lastname></lastname>
  <address>
    <street></street>
   <city></city>
  </address>
</person>

Поэтому мой вопрос:

Можно ли аннотировать эти объекты так, чтобы возвращаемый XML был:

<person>
  <firstname></firstname>
  <lastname></lastname>
  <street></street>
  <city></city>
</person>

т.е. свойства объекта Address рассматриваются как свойства Person (без вложенных тегов)?

Ответы [ 2 ]

2 голосов
/ 13 июля 2010

Вы можете сделать это, используя EclipseLink JAXB (MOXy) .MOXy содержит аннотацию под названием @XmlPath, она используется для сопоставлений на основе XPath.Self XPath (".") Даст вам желаемый эффект:

@Entity 
@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlRootElement 
public Person { 
   private String firstname; 
   private String lastname; 
   private Address address; 

   // getter and setter for firstname/lastname 

   @XmlPath(".")
   public Address getAddress() { return address; } 

   public String getStreet() { return getAddress().getStreet(); } 

   // more getters and setters 
} 

Пример использования расширений EclipseLink JAXB см .:

Чтобы использовать MOXy в качестве реализации JAXB, необходимо добавить файл jaxb.properties в классы вашей модели со следующим содержимым:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Кстати, MOXy также имеет ряд расширений для обработки сущностей JPA:

Я опубликовал серию примеров в своем блоге о том, как создатьСлужба RESTful на основе JPA с использованием JAX-RS:

0 голосов
/ 12 июля 2010

Я не совсем уверен, почему вы хотите, но это может сработать (не проверено)

@XmlRootElement
@Entity
@XmlAccessorType(XmlAccessType.PROPERTY)
public Person {
   private String firstname;
   private String lastname;

   private Address address;

   // getter and setter for firstname/lastname

   @XmlTransient
   public Address getAddress() { return address; }

   public String getStreet() { return getAddress().getStreet(); }

   // more getters and setters
}

@XmlType
@Entity
public Address {
  private String street;
  private String city;

  // getters and setters
}

Лично я бы использовал шаблон DTO на этом этапе. Смешивание аннотаций ORM и сериализации редко бывает полезным.

...