请求/响应对象

时间:2010-05-10 19:15:20

标签: java rest jpa jaxb cxf

我打算使用CXF的其余实现。我想用jaxb注释(例如@XmlRootElement)简单地注释我的实体类,以便创建响应对象。好处是避免代码重复。对于将由单独的Web应用程序使用的(客户端)请求对象,我正在考虑“复制”实体类,删除orm注释以及添加jaxb注释。

基于以上所述:

  1. 是否存在从实体类创建请求/响应对象的危险?
  2. 我的实体类包含关系属性,如果我用@XmlRootElement注释它们,我怎样才能阻止关系属性被添加(或被视为除外)到响应对象?
  3. 是否有更好/更简单的方法来创建请求对象而不是复制实体类,删除/添加注释?

3 个答案:

答案 0 :(得分:1)

您可以毫无困难地组合多个注释。例如,您可以:

@Column
@XmlElement
private String name;

因此,您可以为所有目的重用相同的类,而无需复制它。

您提到的项目 - hyperjaxb3 - 就是这样 - 它根据模式生成JAXB和JPA注释。

答案 1 :(得分:0)

  1. 使用实体驱动XML时,我看到的一个潜在危险可能是将XML使用者与数据库布局耦合(如果所有数据库列都有getter和setter)
  2. @javax.xml.bind.annotation.XmlTransient将从模式中删除一个字段(JAXB将忽略它)。您还可以使用@javax.xml.bind.annotation.XmlAccessorType
  3. 进行自定义
  4. 还有其他方式,但我不确定会有多好。
  5. Per @ bohzo的答案,你甚至不需要复制你的实体。但是如果你不这样做,你可能会将你的实体类耦合到XML,这意味着每当你重构你的实体时你必须更新所有客户端(因为生成的模式会有所不同!)在我看来,XML模式是响应/请求对象应该与任何实体分开设计,以便它们能够更好地服务于它们的目的。这使得将来可以重构实体并专注于他们的目的。

答案 2 :(得分:0)

  

是否存在创造的危险   来自实体的请求/响应对象   类?

您的请求/响应对象需要能够映射到XML。使用标准JAXB API将JPA实体映射到XML有一些难点:

  • 双向关系
  • Cmposite keys
  • 嵌入式密钥类
  • 延迟加载

EclipseLink JAXB (MOXy)具有将JPA实体映射到XML的特定扩展:

  

我的实体类包含关系   属性,如果我要注释它们   使用@XmlRootElement,我该如何停止   来自的关系属性   添加(或考虑分开)到   回应对象?

您可以使用JAXB @XmlTransient批注来防止字段转换为/ fom XML。

  

是否有更好/更简单的创作方式   请求对象而不是复制   实体类,删除/添加   注释

我会建议您直接使用您的实体。有关示例,请参阅: