Jakarta ee JAX-RS从实体到xml的自定义映射

Jakarta ee JAX-RS从实体到xml的自定义映射,jakarta-ee,annotations,rest,jax-rs,Jakarta Ee,Annotations,Rest,Jax Rs,我的问题是: 假设我有两个用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; } 这将被渲染为: <

我的问题是:

假设我有两个用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>


i、 e.地址实体的属性被视为个人属性(没有随附的标签)?

我不完全确定您为什么要这样做,但这可能有效(未测试)

我个人会在这一点上使用DTO模式。混合使用ORM和序列化注释很少是一件好事。

您可以使用。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实体的扩展:

我在我的博客上发布了一系列关于如何使用JAX-RS创建基于JPA的RESTful服务的示例:


不,那没用@XmlTransient使属性在转换为xml时被忽略。我最初确实创建了一组只使用jax rs注释的类,但是当我从数据库中获取任何东西时,我不得不将@Entity注释对象的所有属性复制到@Xml注释对象中——这似乎是一种过火的行为,因为我只想吐出一些Xml。因此,最后我实现了一个MessageBodyWriter,它创建了我想要的xml——它没有我希望的那么灵活,但它可以工作。不过还是要谢谢你。好吧,代码的要点是,它使“地址”成为暂时的,然后包含你想要的属性(也许你需要一个@XmlProperty)。在我看来,写你自己的作者比写DTO更过分,但这取决于你。顶部与莫西的链接已经失效。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory