[RESOLVIDO] Aplicativo Web acusando java.lang.NoClassDefFoundError

Olá amigos do GUJ,

Estou desenvolvendo uma aplicação corporativa onde tenho um módulo EJB e um módulo web por enquanto, estou tentando consumir os serviços dos meus beans de sessão na minha aplicação web pra persistir um objeto, quando eu chamo o serviço ele lança essa exceção pra mim:

javax.ejb.EJBException: java.rmi.ServerError: Error occurred in server thread; nested exception is: java.lang.NoClassDefFoundError: org/postgresql/jdbc4/Jdbc4PreparedStatement

Aparentemente seria o driver do PostgreSQL que estaria faltando, mas não está! Já nem sei o que fazer… o que deveria ser “solução” pra esse tipo de problema não resolve!
Estou usando o Glassfish 3.1 como servidor de aplicação

Meu managedbean

package com.loocaliza.web.mbeans.cadastros;

import com.loocaliza.logic.entities.Cliente;
import com.loocaliza.logic.services.cliente.ClienteService;
import java.io.Serializable;
import javax.ejb.EJB;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 *
 * @author Diogo
 */
@Named(value = "clienteBean")
@SessionScoped
public class ClienteBean implements Serializable {

    @EJB
    private ClienteService service;
    private Cliente cliente;
    private boolean flagLogin;

    /** Creates a new instance of ClienteBean */
    public ClienteBean() {
        this.cliente = new Cliente();
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public boolean isFlagLogin() {
        return flagLogin;
    }

    public void setFlagLogin(boolean flagLogin) {
        this.flagLogin = flagLogin;
    }

    public String cadastrar() {
        service.cadastrar(cliente);
        flagLogin = true;
        return "faces/index.xhtml";
    }
}

Meu bean de sessão

[code]package com.loocaliza.logic.services.cliente;

import com.loocaliza.logic.entities.Cliente;
import javax.ejb.Remove;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

/**
*

  • @author Diogo
    */
    @Stateful(mappedName = “com.loocaliza.clienteservice”)
    public class ClienteServiceImpl implements ClienteService {

    @PersistenceContext(unitName = “LoocalizaPU”, type = PersistenceContextType.EXTENDED)
    private EntityManager em;
    private Cliente cliente;

    @Override
    public boolean cadastrar(Cliente c) {
    try {
    em.persist©;
    this.cliente = c;
    return true;
    } catch (Exception e) {
    return false;
    }
    }

    @Override
    @Remove
    public void logout() {
    }
    }[/code]
    Stacktrace

javax.faces.el.EvaluationException: javax.ejb.EJBException: java.rmi.ServerError: Error occurred in server thread; nested exception is: java.lang.NoClassDefFoundError: org/postgresql/jdbc4/Jdbc4PreparedStatement at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:662) Caused by: javax.ejb.EJBException: java.rmi.ServerError: Error occurred in server thread; nested exception is: java.lang.NoClassDefFoundError: org/postgresql/jdbc4/Jdbc4PreparedStatement at com.loocaliza.logic.services.cliente._ClienteService_Wrapper.cadastrar(com/loocaliza/logic/services/cliente/_ClienteService_Wrapper.java) at com.loocaliza.web.mbeans.cadastros.ClienteBean.cadastrar(ClienteBean.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.el.parser.AstValue.invoke(AstValue.java:234) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43) at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) ... 33 more Caused by: java.rmi.ServerError: Error occurred in server thread; nested exception is: java.lang.NoClassDefFoundError: org/postgresql/jdbc4/Jdbc4PreparedStatement at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.wrapException(Util.java:700) at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:251) at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:152) at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:227) at com.loocaliza.logic.services.cliente.__ClienteService_Remote_DynamicStub.cadastrar(com/loocaliza/logic/services/cliente/__ClienteService_Remote_DynamicStub.java) ... 45 more Caused by: java.lang.NoClassDefFoundError: org/postgresql/jdbc4/Jdbc4PreparedStatement
Desde já agradeço a ajuda!

tem certeza que não está?

pelo erro…aparentemente não se encontra no mesmo class loader que o ejb, como você tem essa certeza? como adicionou no seu path?

Importei a biblioteca pelo Netbeans,

Do mesmo modo que ele encontra outras bibliotecas (como a do Hibernate) ele deveria encontrar essa, não é?

Se for usuário antigo do netbeans desconsidere o que vou dizer: tente limpar e construir o projeto.
Veja onde o netbeans ( se estiver usando ele como lançador do glassfish ) está fazendo o deploy e abra esse .war e veja se dentro da pasta lib há esse driver.

Resolvi o problema, apenas joguei a biblioteca do JDBC para a pasta do servidor e funcionou (???).

Porém, ainda estou na dúvida, isso é o correto a se fazer?

[quote=diogozero]Resolvi o problema, apenas joguei a biblioteca do JDBC para a pasta do servidor e funcionou (???).

Porém, ainda estou na dúvida, isso é o correto a se fazer?[/quote]

O que é certo ou errado?!

Isso depende do ponto de vista de cada um, mas por exemplo eu já trabalhei e deu certo ter o driver (do sqlserver) no servidor, mas lembre que essa lib vai estar disponível para todos projetos daquele perfil… então poderá ocorer problemas.