[Web Services] Resposta gerando ciclo infinito

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: javax.xml.ws.soap.SOAPFaultException: Marshalling Error: A cycle is detected in the object graph. This will cause infinitely deep XML [...].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á.

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

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:public class ItemAdapter extends XmlAdapter< Item, Item > { public Item marshal( Item v ) throws Exception { v.setPedido( new Pedido( v.getPedido().getId() ) ); return v; } public Item unmarshal( Item v ) throws Exception { return v; } }
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!

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