Struts 2 + Json + Lazy (Hibernate)

5 respostas
viniciuspadua

Estou tendo um problema com o json + hibernate.

quero retorna via json um determininado bean. Entretanto, como é uma instância de uma consulta no banco sempre ocorre uma exception.
Dei uma pesquisada e pelo que percebi é algo com o lazy do hibernate. Fiz até um teste que identifiquei o mesmo.
O teste que fiz foi criando um VO, e populando a lista de VO e não da instância do hibernate.

alguem sabe como contornar o problema?

//Exception que ocorrre:
org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: java.lang.reflect.InvocationTargetException
org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:243) at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:165) at org.apache.struts2.json.JSONWriter.value(JSONWriter.java:131) at org.apache.struts2.json.JSONWriter.write(JSONWriter.java:99) at org.apache.struts2.json.JSONUtil.serialize(JSONUtil.java:112) at org.apache.struts2.json.JSONResult.execute(JSONResult.java:198) at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:362) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:266) at 
....

5 Respostas

vinicius.martinez

Velhinho,

Quando voce tem o relacionamento do tipo “Lazy”, voce não traz o objeto carregado e sim o que muitos chamam de “relacionamento”, ou o Proxy dos mesmos.

Sendo assim, se voce precisar mostrar, navegar, editar voce precisa ter esses dados carregados para fazer as manipulações que voce precisa fazer.

Pra te ajudar:

1 - veja se existe algum atributo que voce esta utilizando na sua intarface usando JSON que está como “Lazy”, caso sim, de um “get” nesse(s) cara(s);

Se mesmo assim o problema persistir, acredito que voce esteja com um problema relacionado ao OPIV (Open Session in View), tem muita coisa no google e aqui mesmo no guj, 5 min de pesquisa irá te trazer material para umas 3 ou 4 vidas… :twisted: ;

Deixe a questão do OPIV para depois, reveja suas buscas e seu objeto que voce esta mandando pro JSON que acho que é o caminho mais fácil e menos doloroso.

viniciuspadua

eu sei a questão do lazy!
quero saber se existe como contornar isso!
A idéia do GET é inviável, pois é uma lista e o bean possui muitos campos e o JSON ira querer mapear todos.
Ja abro a sessão na view, mais como o JSON não é um html não func. isso!

bombbr

Tive este problema e resolvi ignorando campos retornados via lazy e criando métodos para encapsular campos de objectos retornados via lazy…
Lembre-se que tive que ignorar campos obtidos via lazy na serialização para JSON.

Exemplo:

public class Funcionario {

    private String id;
    private String nome;

    private Departamento departamento;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    //Caso queira obter a descrição(por exemplo), encapsule em metodos
    public String getDescricaoDepartamento() {
        return getDepartamento().getDescricao();
    }

    //Obtem o departamento por lazy
    //Ignore na serialização JSON
    public Departamento getDepartamento() {
        return departamento;
    }

    public void setDepartamento(Departamento departamento) {
        this.departamento = departamento;
    }
}
viniciuspadua

não queria mudar era o bean. o VO ficou mais fácil!

jyoshiriro

Não sei se ainda precisa da solução, mas veja se essas dicas ajudam:

http://www.jroller.com/aalmiray/entry/json_lib_hibernate_tips_and

http://flexjson.sourceforge.net/

Criado 26 de janeiro de 2010
Ultima resposta 4 de mar. de 2010
Respostas 5
Participantes 4