【问题标题】:JAX-RS custom mapping from entities to xml从实体到 xml 的 JAX-RS 自定义映射
【发布时间】:2010-07-09 11:06:07
【问题描述】:

这是我的问题:

假设我有两个使用 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 属性(没有封闭标签)?

【问题讨论】:

    标签: jakarta-ee annotations rest jax-rs


    【解决方案1】:

    您可以使用EclipseLink JAXB (MOXy) 执行此操作。 MOXy 包含一个名为 @XmlPath 的注解,用于进行基于 XPath 的映射。 self 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 服务:

    【讨论】:

    • 顶部的moxy链接已失效。
    【解决方案2】:

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

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

    【讨论】:

    • 不,那没用。 @XmlTransient 使该属性在转换为 xml 时被忽略。我最初确实创建了一组仅使用 jax-rs 注释进行注释的类,但是当我从数据库中获取任何内容时,我不得不将 @Entity 注释对象中的所有属性复制到 @Xml 注释对象 - 看起来像一个矫枉过正,因为我只想吐出一些 xml。所以最后我最终实现了一个 MessageBodyWriter 来创建我想要的 xml - 它不像我希望的那样灵活,但它可以工作。不过还是谢谢。
    • 嗯,代码的重点是它使“地址”瞬态,然后包含您想要的属性(也许您需要一个@XmlProperty)。在我看来,写自己的作家比 DTO 更矫枉过正,但取决于你。
    猜你喜欢
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多