@GET REST em XML retorna o resultado, mas em JSON dá erro

10 respostas
J

Possuo um serviço WEB funcionando e o método GET está retornando um XML conforme o esperado, porém se eu alterar o @Produces({“application/xml”) para @Produces({“application/json”) dá o seguinte erro:

org.codehaus.jackson.map.JsonMappingException: Direct self-reference leading to cycle (through reference chain: java.util.Vector[0]->entities.Produtos["categoriasId"]->entities.Categorias["categorias"])

Alguém já passou por isso?

Valeu!

10 Respostas

Alexandre_Saudate

Qual implementação JAX-RS você está utilizando?

J

Jersey

Alexandre_Saudate

OK. Você tem duas opções:

  1. Trocar o provedor JSON para um que você sabe que suporta referências cíclicas (não tenho certeza, mas acho que o jettison suporta);
  2. Escrever o seu próprio provedor.

Escolha uma :wink:

J

Se eu quisesse optar pela primeira opção, como exatamente eu faria essa troca?

obrigado.

Alexandre_Saudate

jmountain:
Se eu quisesse optar pela primeira opção, como exatamente eu faria essa troca?

obrigado.

Tira o jackson do classpath e coloca o jar do jettison.

Alexandre_Saudate

Dê uma olhada neste link: http://jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1740

Deve te ajudar :wink:

J

Obrigado pela dica @asaudate

J

Só uma coisa que eu não entendi…

Enquanto meu serviço não precisava retornar dados relacionados o formato JSON funcionava perfeitamente, porém começou a dar erro após eu relacionar as entidades, em JSON eu não consegui mais, somente XML.

Se essa informção servir para alguma coisa, ta aí!

Alexandre_Saudate

jmountain:
Só uma coisa que eu não entendi…

Enquanto meu serviço não precisava retornar dados relacionados o formato JSON funcionava perfeitamente, porém começou a dar erro após eu relacionar as entidades, em JSON eu não consegui mais, somente XML.

Se essa informção servir para alguma coisa, ta aí!

A exceção que estava dando era por causa de (possíveis) ciclos entre as entidades. A biblioteca que você estava usando não consegue lidar com esses ciclos.

J

Sim, quanto as excesões de ciclo eu resolvi assim:

  • Implementei a interface CycleRecoverable
  • Sobrescrevi o método onCycleDetected e resolveu, segue:
public class Categorias implements Serializable,CycleRecoverable {  
    .  
    .  
    .  
    .  
      
        @Override  
        public Object onCycleDetected(Context cntxt) {  
            Categorias categoria = new Categorias(this.categoriasId);  
            return categoria;  
        }      
      
    }//fim classe Categorias

Mas a partir daí eu só consigo exibir XML, JSON não consigo mais exibir, aí você me propôs tirar o jackson do classpath e coloca o jar do jettison.

Bem, minha dúvida é de como fazer isso. :oops:

Criado 13 de fevereiro de 2012
Ultima resposta 13 de fev. de 2012
Respostas 10
Participantes 2