Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro em JAXB e JPA Hibernate - @OneToMany - @Delete

Tenho um interface web que mostra os clientes e seus comentarios (@OneToMany) e que para deletar e atualizar um comentario, envia o id do Comentario e para inserir um comentario manda o id do Comentario = 0. Primeira pergunta, essa é uma abordagem boa que segue os princípios REST?

Está ocorrendo algum erro que não estou conseguindo desvendar o porquê ao tentar deletar. Segue o erro:

15:53:19,679 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/AbeWebJboss].[javax.ws.rs.core.Application]] (http--127.0.0.1-8080-1) Servlet.service() for servlet javax.ws.rs.core.Application threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
    at org.jboss.resteasy.core.SynchronousDispatcher.unwrapException(SynchronousDispatcher.java:345) [resteasy-jaxrs-2.2.1.GA.jar:]

código da ComentarioController:

@DELETE
    @Path("apaga/{idComentario}")    
    @Produces(MediaType.APPLICATION_JSON)
    public Response apagaComentario(@PathParam("idComentario") int idComentario ) {                
        comentarioDAO.apaga(idComentario);        
        return Response.created(null).build();
    }

código da ComentarioDAO:

public void apaga(int idComentario) {
        Comentario comentario = em.find(Comentario.class, idComentario);
        em.remove(comentario);
    }

código da Cliente

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "id_cliente")
    private List<Comentario> comentarios = new ArrayList<Comentario>();

código da Comentario

@ManyToOne
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;
9 respostas

Boa tarde, Rogerio! Como vai?

Tenho um interface web que mostra os clientes e seus comentarios (@OneToMany) e que para deletar e atualizar um comentario, envia o id do Comentario e para inserir um comentario manda o id do Comentario = 0. Primeira pergunta, essa é uma abordagem boa que segue os princípios REST?

Não é uma boa abordagem pq vc está saindo dos princípios do REST! O correto seria vc ter um método da sua classe atendendo requisições do tipo POST para inserir um novo comentário e outro método atendendo requisições do tipo DELETE para exclusão de comentários.

Em relação ao seu problema, o que está acontecendo é um NullPointerException, mas o trecho que vc colou não tem mta informação útil. Cole a stacktrace completa aqui que eu te ajudo a verificar o que está acontecendo.

13:09:26,435 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/AbeWebJboss].[javax.ws.rs.core.Application]] (http--127.0.0.1-8080-1) Servlet.service() for servlet javax.ws.rs.core.Application threw exception: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
    at org.jboss.resteasy.core.SynchronousDispatcher.unwrapException(SynchronousDispatcher.java:345) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.handleApplicationException(SynchronousDispatcher.java:321) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.handleException(SynchronousDispatcher.java:214) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.handleInvokerException(SynchronousDispatcher.java:190) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:534) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:496) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.2.1.GA.jar:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) [weld-core-1.1.2.Final.jar:2011-07-26 15:02]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:49) [jboss-as-jpa-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.1.Final]
    at java.lang.Thread.run(Unknown Source) [:1.8.0_40]
Caused by: java.lang.NullPointerException
    at br.gov.caixa.dao.ComentarioDAO.apaga(ComentarioDAO.java:64) [classes:]
    at br.gov.caixa.controller.ComentarioController.apagaComentario(ComentarioController.java:60) [classes:]
    at br.gov.caixa.controller.ComentarioController$Proxy$_$$_WeldClientProxy.apagaComentario(ComentarioController$Proxy$_$$_WeldClientProxy.java) [classes:]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.8.0_40]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [:1.8.0_40]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [:1.8.0_40]
    at java.lang.reflect.Method.invoke(Unknown Source) [:1.8.0_40]
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:255) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:220) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:209) [resteasy-jaxrs-2.2.1.GA.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:519) [resteasy-jaxrs-2.2.1.GA.jar:]
    ... 24 more

Rogerio, de acordo com a stacktrace precisamos dar uma olhada na classe ComenetarioDAO!

Caused by: java.lang.NullPointerException
    at br.gov.caixa.dao.ComentarioDAO.apaga(ComentarioDAO.java:64)

Cole aqui o conteúdo dessa classe indicando onde é a linha 64.

Daí darei uma olhada e vejo o que pode ser!

public void apaga(int idComentario) {
        Comentario comentario = em.find(Comentario.class, idComentario); // linha 64
        em.remove(comentario);
    }

Rogerio, aparentemente o problema é o seu EntityManager representado pela variável em que está nula. Vc talvez tenha errado na configuração com o BD, ou na forma como cria o EntityManager ou até mesmo na forma como injeta a sua dependência.

Vc irá precisar verificar essas coisas aí no seu projeto.

O curioso é que é assim: esse erro acima ocorria quando eu não deixava o getCliente habilitado na classe comentario. Quando habilitei o getCliente na classe comentario, começou a dar o erro abaixo quando abria a pagina na web para carregar os clientes e comentarios. Será que tem alguma pista com esse erro para resolver o problema do delete?

14:38:03,284 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/AbeWebJboss].[javax.ws.rs.core.Application]] (http--127.0.0.1-8080-2) Servlet.service() for servlet javax.ws.rs.core.Application threw exception: java.lang.ClassNotFoundException: org.codehaus.jackson.map.JsonMappingException$Reference from [Module "org.codehaus.jackson.jackson-mapper-asl:main" from local module loader @1f8bb67 (roots: C:\Users\c087320\Documents\jboss-as-web-7.0.1.Final\modules)]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:358)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:330)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:307)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:101)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:174)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:131)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:363)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:314)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:112)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:160)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:131)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:160)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:131)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:363)
    at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:314)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:112)

Será que tem algo a ver com a versão do jboss, jaxb? Já tentei com e sem os comentários abaixo. a comentarioDAO está assim:

//@Stateful
public class ComentarioDAO {
     //@PersistenceContext(type=PersistenceContextType.EXTENDED)
    private EntityManager em;
solução!

Gabriel, obrigado pela dica. Consegui resolver. Revisitei o curso de EJB e percebi que tinha erro na configuração: eu estava usando @Stateful e mudei para @Stateless (não sei se faz tanta diferença, mas) e apenas a DAO estava com @Stateful; inclui no Controller tb e por ultimo

@DELETE
    @Path("apaga/{idComentario}")    
    @Produces(MediaType.APPLICATION_JSON)
    public Response apagaComentario(@PathParam("idComentario") int idComentario ) {                
        comentarioDAO.apaga(idComentario);        
        return Response.ok().build();
    }

nesse trecho, estava dando nullpointer tb qdo usava

return Response.created(null).build();

Obrigado. Está dando erro ainda quando descomento o getCliente na classe Comentario, mas não sei ainda o porquê.