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

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!

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

Jersey

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:

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

obrigado.

[quote=jmountain]Se eu quisesse optar pela primeira opção, como exatamente eu faria essa troca?

obrigado.[/quote]

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

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

Deve te ajudar :wink:

Obrigado pela dica @asaudate

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í!

[quote=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í![/quote]

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.

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: