2010-07-09 5 views
1

Вот моя проблема: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 (без закрывающих тегов)?

ответ

0

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

@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 и Serialization редко бывает хорошим.

+0

неа, не работает. @XmlTransient заставляет свойство игнорировать при преобразовании в xml. Сначала я создал набор классов, аннотированных только аннотациями jax-rs, но затем, когда я извлекал что-либо из базы данных, мне пришлось скопировать все свойства из аннотированного объекта @Entity в аннотированный объект @Xml - казалось, overkill, так как все, что я хотел, было плюнуть на некоторый xml.Таким образом, в конце концов я закончил реализацию MessageBodyWriter, который создает xml, который я хочу - он не так гибок, как мне хотелось, но он работает. Но все равно спасибо. – Jakub

+0

Ну, точка кода заключается в том, что он делает переходный период «Адрес», а затем включает в себя свойства, которые вы хотите (возможно, вам нужен @XmlProperty). Мне кажется, что написание собственного писателя более утомительно, чем DTO, но до вас. –

2

Вы можете сделать это, используя 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 

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

Я разместил ряд примеров в своем блоге о том, как создать JPA основанный на использовании RESTful с использованием JAX-RS:

+0

Ссылка на moxy наверху мертва. – Jakub

+0

@Jakub - Спасибо, я исправил ссылку. –

 Смежные вопросы

  • Нет связанных вопросов^_^