用休眠和弹簧返回不同深度的json响应

时间:2014-01-02 10:06:01

标签: json spring hibernate spring-mvc jackson

我有两个不同的用例需要不同的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;
    }

   ...

}

第一个用例仅需idname。这将适用于上面的代码。

@RequestMapping("/parents")
@ResponseBody
public List<Parents> getParents() {
    return parentService.listAll();
}

第二个用例需要idname以及child。我能解决这个问题的唯一方法是删除@JsonIgnore注释并修改我的hibernate查询。

from Parentfrom Parent p join fetch p.child c

然而,通过这样做,现在我的第一个查询也将选择子元素,我不希望这样,因为第一个语句可能返回1000多行,我不希望还返回所有子对象数据的开销。我不能对第一种情况from Parent p使用不同的查询,因为当jackson尝试序列化时,它将为子对象抛出一个惰性初始化异常,因为@JsonIgnore现在已被删除。

有没有办法使用spring和hibernate来解决这个问题?

2 个答案:

答案 0 :(得分:0)

您可以使用@JsonFilter批注在每个实体bean上定义特定的过滤器。然后,在Spring应用程序配置中定义一个自定义ObjectMapper,您可以在其中为每个JSON过滤器指定要(J)为JSON序列化的属性。

答案 1 :(得分:0)

问题是域模型(父/子)不一定是通过网络发送的好候选者,这是常见原因之一(并不总是需要整个数据),另一个原因是例如模型循环引用,以防止序列化。

这可以通过为每个用例创建一个单独的view model来解决,只需要所需的字段,然后将其转换为JSON。

有助于自动化域模型和视图模型之间映射的库的一个示例是Dozer