Estou desenvolvendo uma aplicação Web com o Jersey e o GSon.
Até agora estava funcionando lindamente, mas do nada, começou me retornar um erro ao tentar acessar o método (Eu já estava acessando esse método).
Jan 03, 2013 5:17:52 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.StackOverflowError
Alguém saberia me dizer o que pode ser?
Já tentei refazer o build path umas 20 vezes e nada.
Você não mostrou o código das classes que está serializando em JSON, mas esse StackOverflow ai provavelmente é porque você deve ter algum ciclo na sua composição. Por exemplo:
[code]public class Foo {
private Bar bar;
}
public class Bar {
private List foos;
}[/code]
Você tem uma lista de Foo dentro de Bar. Quando tenta serializar um Bar, ele tenta pegar os Foos, mas cada Foo tem um Bar, que tem uma lista de Foos entendeu? Entra em uma cadeia de chamadas infinitas, por isso o Stack Overflow!!! Verifique se é isso.
Lembrando que se eu tentar acessar o método abaixo ele funciona normalmente:
@GET
@Path("/listarNormal")
@Produces("application/json")
public List<Categoria> listAll() {
categoriaDAO.beginTransaction();
List<Categoria> categoria = categoriaDAO.findAll();
categoriaDAO.closeTransaction();
return categoria;
}
Agora se eu tento acessar o método abaixo ele gera o erro descrito anteriomente, e a única coisa que muda é que ele tenta converter o resultado para GSon.
@GET
@Path("/listar")
@Produces("application/json")
public String androidListarTodos() {
return new Gson().toJson(listAll());
}
[quote=davidbuzatto]Você não mostrou o código das classes que está serializando em JSON, mas esse StackOverflow ai provavelmente é porque você deve ter algum ciclo na sua composição. Por exemplo:
[code]public class Foo {
private Bar bar;
}
public class Bar {
private List foos;
}[/code]
Você tem uma lista de Foo dentro de Bar. Quando tenta serializar um Bar, ele tenta pegar os Foos, mas cada Foo tem um Bar, que tem uma lista de Foos entendeu? Entra em uma cadeia de chamadas infinitas, por isso o Stack Overflow!!! Verifique se é isso.[/quote]
Então, eu tenho isso sim! Mas é por conta do hibernateJPA.
Por exemplo, na minha classe categoria eu tenho:
@OneToMany (mappedBy="categoria")
private List<SubCategoria> subcategoria;
E na classe subcategoria eu tenho:
@ManyToOne
@JoinColumn(name="idCategoria")
private Categoria categoria;
Nas duas classes já estou implementando a interface CycleRecoverable.
O engraçado é que estava funcionando até agora de pouco.
Eu entendo, mas você usando o GSON vai ter q escolher que lado você quer.
Para fazer isso, você tem que fazer algo deste tipo (peguei de um projeto meu).
É fácil achar na documentação do GSON como fazer isso.
Você precisa ter a “Estratégia de exclusão” e uma anotação para indicar quais campos serão excluídos.
Estratégia de exclusão de campos para o Gson usando a anotação @ExcluirJSON.
@author David Buzatto
*/
public class EstrategiaExclusaoJSON implements ExclusionStrategy {
@Override
public boolean shouldSkipField( FieldAttributes fa ) {
// verifica se tem a anotação da exclusão do JSON
return fa.getAnnotation( ExcluirJSON.class ) != null;
}
@Override
public boolean shouldSkipClass( Class<?> type ) {
// aceita qualquer classe
return false;
}