[Web Services] Resposta gerando ciclo infinito  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
bruno_cobra
JavaTeenager

Membro desde: 08/04/2007 23:59:14
Mensagens: 194
Localização: Lajeado, RS
Offline

Pessoal,

Estamos desenvolvendo uma aplicação que disponibiliza diversos serviços que serão consumidos por outras aplicações internas. Toda a estrutura é baseada em Hibernate, Spring e CXF.

No mapeamento das entidades, temos diversos relacionamentos bidirecionais que não podem ser alterados. Isto está me causando uma enorme dor de cabeça agora que temos que começar a consumir serviços que utilizam estas entidades, pois sempre obtenho a seguinte exceção: Tentei corrigir o problema através da anotação @XmlTransient, mas isto não é solução pois ela vai fazer a transformação desconsiderar o objeto. Imaginem que tenho uma entidade Pedido e outra Item (a primeira tem uma lista da segunda; a segunda conhece a primeira por causa da chave estrangeira). No mesmo serviço, posso solicitar o retorno do Pedido com sua lista de Itens ou apenas o Pedido ou apenas os Itens. Sendo assim, a anotação não resolve nada. (Isto é apenas um exemplo, possuo casos mais complexos.)

Também tentei implementar a interface CycleRecoverable, mas não deu em nada. Alguém já passou por isso? Alguma ideia do que fazer?
Qualquer ideia será muito bem vinda. Obrigado desde já.

http://blog.brunozambiazi.com
-
[WWW]
novato25
JavaBaby
[Avatar]

Membro desde: 10/03/2008 07:48:50
Mensagens: 92
Offline

Estou exatamente com o mesmo problema. Alguém saberia como resolver e postar aqui como se faz? Obrigado!

Any fool can write code that a computer can understand. Good programmers write code that humans can understand. (Martin Fowler)
bruno_cobra
JavaTeenager

Membro desde: 08/04/2007 23:59:14
Mensagens: 194
Localização: Lajeado, RS
Offline

Eu consegui resolver o problema criando classes que extendessem javax.xml.bind.annotation.adapters.XmlAdapter. Vou tentar colocar um exemplo:

Imagina um caso onde temos duas entidades, Pedido e Item. O Pedido possui uma lista de Item, enquando Item também conhece o Pedido. Isto já caracteriza um relacionamento bidirecional e, quando eu solicitasse o carregamento de um Pedido com todos os seus Item, ocorreria o problema do ciclo infinito. Pelo menos este era o meu caso.

Para corrigir, eu parti do seguinte princípio: nestes casos, eu não preciso que o Pedido esteja totalmente carregado em cada Item. Eu preciso, no máximo, do ID dele. Por isso, criei um Adapter para o Item que fazia justamente o trabalho de clonar o objeto Pedido, deixá-lo apenas com o ID setado, e aí sim "recolocá-lo" no Item.

Seria mais ou menos assim:
Depois disso, bastou anotar a classe Item com @XmlJavaTypeAdapter( ItemAdapter.class ).

Bom, esta é apenas uma forma que achei para fazer e que atendeu ao meu caso. Espero que te ajude. Boa sorte!

http://blog.brunozambiazi.com
-
[WWW]
novato25
JavaBaby
[Avatar]

Membro desde: 10/03/2008 07:48:50
Mensagens: 92
Offline

bruno_cobra,

agradeço sua resposta. Resolvi o problema implementando a interface CycleRecoverable (com.sun.xml.bind.CycleRecoverable), como descrito no seguinte tópico:

http://www.guj.com.br/java/119828-web-serviceejb-problema-com-loop-infinito-relacionamento-bidirecional-entre-entidades

Any fool can write code that a computer can understand. Good programmers write code that humans can understand. (Martin Fowler)
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team