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

时间:2010-07-09 11:06:07

标签: java-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;
}

这将呈现为:

<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属性(没有封闭标签)?

2 个答案:

答案 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和序列化注释很少是好事。