JAX-RS,带有JAXB @XmlTransient

时间:2014-05-25 04:50:24

标签: java web-services rest jaxb jax-rs

我正在使用JAX-RS和JAXB开发RESTful服务。我有一个Complain类,以下是它的条纹版本:

@Entity
@Table(name = "complain")
@XmlRootElement
public class Complain implements Serializable {

  private String title;
  private String description;

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "complainidComplain")
   private Collection<Comment> commentCollection;

   @XmlTransient
   public Collection<Comment> getCommentCollection() {
     return commentCollection;
   }
}

注意:我使用getCommentCollection注释装饰了@XmlTransient,因为当我在@Path("/")寻找所有投诉时,我不想看到评论。

example.com/api/complain /

<complains>
 <complain>
  <title>Foo</title>
  <description>Foo is foo</description>
 </complain>
 <complain>
  <title>Bar </title>
  <description>Bar is bar</description>
 </complain>
</complains>

但是当我在Complain寻找特定的@Path("/{id}")时,我需要将注释显示在XML输出中。

example.com/api/complain/1

<complain>
 <title>Foo</title>
 <description>Foo is foo</description>
 <comments>
  <comment> Yes, i agree </comment>
  <comment> Lorem if foo </comment>
 </comments>
</complain>

由于我使用getCommentCollection注释装饰了@XmlTransient,因此当我在Complain寻找特定@Path("/{id}")时,我无法收到评论。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

使用@XmlTransient进行批注是一个编译时决策,因此您无法在运行时动态更改它。正如How to conditionally serialize with JAXB or Jackson所述,您可以使用Jacksons JsonViewMOXy's external mapping-files

如果您不想更改序列化程序,可以将Complain映射到有限的类,例如ComplainPreview只有titledescription属性的commentCollection。您也可以将null设置为select new com.yourcompany.Complain(c.title, c.description) from Complain c ,然后再将其返回到JAX-RS资源方法中。

最后(也许是最干净的)解决方案:仅获取要从数据库返回的数据。因此,您需要针对两个用例的不同查询。例如,您可以使用Constructor Expression作为第一个:

{{1}}

不要忘记添加通讯构造函数。