这是我的问题:
假设我有两个用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属性(没有封闭标签)?
答案 0 :(得分: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实体的扩展:
我在博客上发布了一系列示例,介绍如何使用JAX-RS创建基于JPA的RESTful服务:
答案 1 :(得分: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和序列化注释很少是好事。