有没有办法让杰克逊jsonize只获取延迟加载的对象

时间:2011-09-16 05:44:48

标签: java json spring lazy-loading jackson

我知道这一点已经在许多地方得到了解决。但我找不到一个以简单的方式覆盖它的地方。

在控制器中,当我返回人物时,杰克逊试图序列化案例。我不需要在这里发送案例表。我可以做person.setCase(null)但我认为必须有更好的方法来做到这一点。有没有办法告诉杰克逊如果没有提取,不要序列化案件?

我有一堆具有一对多关系的Pojos,就像hbopojogen创建的那样

@OneToMany( fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE         }, mappedBy = "person"  )
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@Column( nullable = false  )
@JsonManagedReference
public Set<Case> getCase() {
    return this.case;

}

@ManyToOne( cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY )
@org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinColumn(name = "PERSON_ID", nullable = true )
@JsonBackReference
public Person getPerson() {
    return this.person;

}

  public @ResponseBody Person searchPersonByCode(@RequestParam String codeString){

        int code = Integer.parseInt(codeString);
        Patient person = this.personDao.getByCode(code );

        return person;
    }

谢谢,

2 个答案:

答案 0 :(得分:1)

我不会直接回答你的问题。相反,我会试着说服你改变你认为可能/应该做的方式。
您的问题是,您希望防止在未明确获取的情况下序列化大小写。当杰克逊序列化你的对象时,我猜你得到了LazyInitializationException。而不是试图避免这个问题,请尝试认为下面两个解决方案之一并不是更好:
解决方案1:在视图中进行“打开会话”。杰克逊将能够始终序列化“案例”。
解决方案2:使用@JsonIgnore注释“case”

无论你做什么都试着保持一致,不要试图让你的应用程序在特殊场合有所不同。它会在您的设计中引入非显而易见性,使您的应用程序难以维护。

干杯

答案 1 :(得分:1)

你签出了Jackson Hibernate module吗? Core jackson对lib / framework特有的功能做不了多少,但是扩展模块可以 - 而且这个特别支持不解析延迟引用的概念。