No meu cenário, o problema ocorria ao utilizar o componente Response do RESTEasy como retorno do método. Pra ficar mais claro a seguir um exemplo de código simulando o erro, no caso a entidade e o endpoint do RESTEasy:
@Entity
@XmlRootElement
public class Carro {
@Id
private Long id;
@NotNull
private String renavam;
private String placa;
@NotNull
@ManyToOne
private Modelo modelo;
//...
}
@Path("/carros")
public class CarroEndpoint {
...
@GET
@Path("/{id:[0-9][0-9]*}")
@Produces("application/xml")
public Response findById(@PathParam("id") Long id) {
try {
Carro c = service.findById(id);
return Response.ok(c).build();
} catch (NoResultException nrex) {
return Response.status(Status.NOT_FOUND).build(); //404
}
}
@GET
@Produces("application/xml")
public List<Carro> listAll() {
return service.listAll();
}
@GET
@Path("/{modelo}")
@Produces("application/xml")
public Response listByModelo(@PathParam("modelo") String descModelo) {
Modelo m = service.findModeloByDescricao(descModelo);
if (m == null) {
return Response.status(Status.NOT_FOUND).build();
}
List<Carro> carros = service.findByModelo(m);
return Response.ok(carros).build(); //o problema ocorre aqui
}
}
Os métodos findById e listAll funcionam corretamente, ambos devolvem o XML representando os dados dos carros encontrados de acordo com a consulta. Note o retorno desses dois métodos: a entidade Carro e uma lista de Carros.
A exception ocorre no terceiro método, no listByModelo, aonde faço uso da Response (componente do RESTEasy). Nesse caso o RESTEasy não consegue transformar o ArrayList em XML. A mesma situação acontece com outra coleção, por exemplo HashSet.
Pra resolver o problema, eu utilizei o GenericEntity para "tipar" a lista, de forma que o RESTEasy possa realizar a transformação em XML. A mesma abordagem funciona com HashSet. A seguir a nova versão de listByModelo:
...
@GET
@Path("/{modelo}")
@Produces("application/xml")
public Response listByModelo(@PathParam("modelo") String descModelo) {
Modelo m = service.findModeloByDescricao(descModelo);
if (m == null) {
return Response.status(Status.NOT_FOUND).build();
}
List<Carro> carros = service.findByModelo(m);
GenericEntity<List<Carro>> entity = new GenericEntity<List<Carro>>(carros);
return Response.ok(entity).build(); //ok
}
...
A versão do RESTEasy utilizada foi a 2.3.6.Final.
[]s
http://twitter.com/edermag
http://www.yaw.com.br
No comments:
Post a Comment