我有两个不同的用例需要不同的json响应。
为简洁起见,我省略了一些hibernate / spring。
public class Parent {
private long id;
private String name;
private Child child;
...
@JsonIgnore
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="child")
public getChild() {
return this.child;
}
...
}
第一个用例仅需id
和name
。这将适用于上面的代码。
@RequestMapping("/parents")
@ResponseBody
public List<Parents> getParents() {
return parentService.listAll();
}
第二个用例需要id
和name
以及child
。我能解决这个问题的唯一方法是删除@JsonIgnore
注释并修改我的hibernate查询。
from Parent
至from Parent p join fetch p.child c
然而,通过这样做,现在我的第一个查询也将选择子元素,我不希望这样,因为第一个语句可能返回1000多行,我不希望还返回所有子对象数据的开销。我不能对第一种情况from Parent p
使用不同的查询,因为当jackson尝试序列化时,它将为子对象抛出一个惰性初始化异常,因为@JsonIgnore
现在已被删除。
有没有办法使用spring和hibernate来解决这个问题?
答案 0 :(得分:0)
您可以使用@JsonFilter批注在每个实体bean上定义特定的过滤器。然后,在Spring应用程序配置中定义一个自定义ObjectMapper,您可以在其中为每个JSON过滤器指定要(J)为JSON序列化的属性。
答案 1 :(得分:0)
问题是域模型(父/子)不一定是通过网络发送的好候选者,这是常见原因之一(并不总是需要整个数据),另一个原因是例如模型循环引用,以防止序列化。
这可以通过为每个用例创建一个单独的view model来解决,只需要所需的字段,然后将其转换为JSON。
有助于自动化域模型和视图模型之间映射的库的一个示例是Dozer。