JAX-RS пользовательское отображение от объектов до xml

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

Скажите, что у меня есть два объекта, аннотируемые аннотациями 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>

т.е. свойства объекта Адреса рассматривают как свойства Person (без тегов включения)?

1
задан Jakub 9 July 2010 в 11:06
поделиться

2 ответа

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

@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 и аннотаций сериализации редко бывает удачным.

0
ответ дан 2 September 2019 в 23:10
поделиться

Это можно сделать с помощью EclipseLink JAXB (MOXy) . MOXy содержит аннотацию @XmlPath, которая используется для сопоставлений на основе XPath. Собственный 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:

2
ответ дан 2 September 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: