Вот моя проблема:
Скажите, что у меня есть два объекта, аннотируемые аннотациями 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 (без тегов включения)?
Я не совсем уверен, зачем вам это нужно, но это может сработать (не проверено)
@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 и аннотаций сериализации редко бывает удачным.
Это можно сделать с помощью 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: