我正在使用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}")
时,我无法收到评论。我怎样才能做到这一点?
答案 0 :(得分:2)
使用@XmlTransient
进行批注是一个编译时决策,因此您无法在运行时动态更改它。正如How to conditionally serialize with JAXB or Jackson所述,您可以使用Jacksons JsonView或MOXy's external mapping-files。
如果您不想更改序列化程序,可以将Complain
映射到有限的类,例如ComplainPreview
只有title
和description
属性的commentCollection
。您也可以将null
设置为select new com.yourcompany.Complain(c.title, c.description) from Complain c
,然后再将其返回到JAX-RS资源方法中。
最后(也许是最干净的)解决方案:仅获取要从数据库返回的数据。因此,您需要针对两个用例的不同查询。例如,您可以使用Constructor Expression作为第一个:
{{1}}
不要忘记添加通讯构造函数。