A situação é a seguinte, tenho um módulo EJB chamado OperadoraIntegracao, que tem as entidades e cria o banco de dados.
Tenho outro módulo EJB chamado OperadoraCelular com as regras de negócio. Este último módulo possui o EJB OperadoraIntegracao.
E tenho uma aplicação cliente que é pra acessar o EJB OperadoraCelular. Mas quando executo o cliente dá erro. Já verifiquei a console do Glassfish e o arquivo de log mas não ajudam em nada. Só para constar, já testei os 3 métodos EJB numa aplicação cliente e todos funcionaram. O problema é quando um EJB tem que acessar outro EJB, não sei como fazer. O lookup está correto.
Alguém aí sabe o que possa ser? Vou deixar o erro e os 2 sessionbean e o main do cliente.
Ahh, e outra coisa, eu consigo implantar os dois módulos EJB sem problemas. O erro é quando vou executar o Cliente
Grave: EJB5070: Exception creating stateless session bean : [OperadoraCelularSessionBean]
Advertência: A system exception occurred during an invocation on EJB OperadoraCelularSessionBean method public void br.com.operadora.sessionbean.OperadoraCelularSessionBean.cadastrarCliente(java.lang.String,java.lang.String)
javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454)
at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2528)
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1895)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:205)
at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79)
at $Proxy259.cadastrarCliente(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528)
at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990)
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539)
at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:726)
at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:247)
at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:449)
... 22 more
Caused by: javax.ejb.CreateException: Could not create stateless EJB
at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:534)
at com.sun.ejb.containers.StatelessSessionContainer.access$000(StatelessSessionContainer.java:95)
at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:724)
... 24 more
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=br.com.operadora.sessionbean.OperadoraCelularSessionBean/daoSessionBean,Remote 3.x interface =br.com.operadora.negocio.sessionbean.DaoSessionBean,ejb-link=null,lookup=,mappedName=,jndi-name=br.com.operadora.negocio.sessionbean.DaoSessionBean,refType=Session into class br.com.operadora.sessionbean.OperadoraCelularSessionBean: Lookup failed for 'java:comp/env/br.com.operadora.sessionbean.OperadoraCelularSessionBean/daoSessionBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:703)
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:470)
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:171)
at com.sun.ejb.containers.BaseContainer.injectEjbInstance(BaseContainer.java:1691)
at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:494)
... 26 more
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/br.com.operadora.sessionbean.OperadoraCelularSessionBean/daoSessionBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=br.com.operadora.sessionbean.OperadoraCelularSessionBean/daoSessionBean,Remote 3.x interface =br.com.operadora.negocio.sessionbean.DaoSessionBean,ejb-link=null,lookup=,mappedName=,jndi-name=br.com.operadora.negocio.sessionbean.DaoSessionBean,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean' [Root exception is javax.naming.NamingException: Lookup failed for 'br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean not found]]]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:599)
... 30 more
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=br.com.operadora.sessionbean.OperadoraCelularSessionBean/daoSessionBean,Remote 3.x interface =br.com.operadora.negocio.sessionbean.DaoSessionBean,ejb-link=null,lookup=,mappedName=,jndi-name=br.com.operadora.negocio.sessionbean.DaoSessionBean,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean' [Root exception is javax.naming.NamingException: Lookup failed for 'br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean not found]]
at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:178)
at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1106)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:776)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:172)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498)
... 34 more
Caused by: javax.naming.NamingException: Lookup failed for 'br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean not found]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:173)
... 39 more
Caused by: javax.naming.NameNotFoundException: br.com.operadora.negocio.sessionbean.DaoSessionBean#br.com.operadora.negocio.sessionbean.DaoSessionBean not found
at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248)
at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215)
at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77)
at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:119)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:505)
... 43 more
Interface e SessionBean que persiste no banco
package br.com.operadora.service;
import javax.ejb.Remote;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.operadora.negocio.service;
import javax.ejb.Remote;
@Remote
public interface IDao<T> {
public void persist(Object obj);
}
package br.com.operadora.negocio.sessionbean;
import br.com.operadora.negocio.service.IDao;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless(mappedName = "DaoOperadora")
public class DaoSessionBean<T> implements IDao<T> {
@PersistenceContext(unitName = "DaoUP")
private EntityManager manager;
@Override
public void persist(Object obj) {
manager.persist(obj);
}
}
Interface e SessionBean com as regras de negócio
package br.com.operadora.service;
import javax.ejb.Remote;
@Remote
public interface IOperadoraCelularRemote {
public void cadastrarCliente(String cpfCliente, String nomeCliente);
public void cadastrarTelefone(String cpfCliente, String numeroCelular);
public void inserirCredito(String cpfCliente, String numeroTelefone, double valorACreditar);
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.operadora.sessionbean;
import br.com.operadora.negocio.entity.Celular;
import br.com.operadora.negocio.entity.Cliente;
import br.com.operadora.negocio.entity.Recarga;
import br.com.operadora.negocio.sessionbean.DaoSessionBean;
import br.com.operadora.service.IOperadoraCelularRemote;
import javax.ejb.EJB;
import javax.ejb.Stateless;
/**
*
* @author andersonribeiro
*/
@Stateless(mappedName="OperadoraCelular")
public class OperadoraCelularSessionBean implements IOperadoraCelularRemote {
@EJB
private DaoSessionBean daoSessionBean;
@Override
public void cadastrarCliente(String cpfCliente, String nomeCliente) {
Cliente cliente = new Cliente();
cliente.setCpfCliente(cpfCliente);
cliente.setNomeCliente(nomeCliente);
daoSessionBean.persist(cliente);
}
@Override
public void cadastrarTelefone(String cpfCliente, String numeroCelular) {
Cliente cliente = new Cliente();
Celular celular = new Celular();
cliente.setCpfCliente(cpfCliente);
celular.setNumeroCelular(numeroCelular);
celular.setCliente(cliente);
daoSessionBean.persist(celular);
}
@Override
public void inserirCredito(String cpfCliente, String numeroTelefone, double valorACreditar) {
Cliente cliente = new Cliente();
Celular celular = new Celular();
Recarga recarga = new Recarga();
cliente.setCpfCliente(cpfCliente);
celular.setNumeroCelular(numeroTelefone);
recarga.setValorCredito(valorACreditar);
recarga.setCliente(cliente);
recarga.setCelular(celular);
daoSessionBean.persist(recarga);
}
}
Aplicação cliente
package br.com.operadora.client;
import br.com.operadora.service.IOperadoraCelularRemote;
import java.util.Scanner;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Main {
private Scanner scanner = new Scanner(System.in);
private IOperadoraCelularRemote iOpCelularRemote;
public Main() {
try {
InitialContext context = new InitialContext();
iOpCelularRemote = (IOperadoraCelularRemote) context.lookup("OperadoraCelular");
} catch (NamingException ex) {
System.out.println("Erro main " + ex);
}
}
public void exibirMenu() {
System.out.println("________________________________________________________________");
System.out.println("\n\n| - - - - - - - - - - - MENU - - - - - - - - - - - -|");
System.out.println("| [0] - SAIR DO SISTEMA |");
System.out.println("| [1] - CADASTRAR CLIENTE |");
System.out.println("| [2] - CADASTRAR TELEFONE |");
System.out.println("| [3] - INSERIR CRÉDITOS |");
System.out.println("| - - - - - - - - - - - - - - - - - - - - - - - - - --|");
System.out.print(" Opção : ");
}
public void chamarOpcao() {
int opcao;
String entrada;
do {
exibirMenu();
try {
entrada = scanner.nextLine();
opcao = Integer.parseInt(entrada);
switch (opcao) {
case 0:
System.out.println("\nVOCÊ SAIU DA APLICAÇÃO!");
System.exit(0);
break;
case 1:
cadastrarCliente();
break;
case 2:
cadastrarTelefone();
break;
case 3:
inserirCreditos();
break;
default:
System.out.println("\nOPCÃO INVÁLIDA!");
break;
}
} catch (NumberFormatException e) {
System.out.println("________________________________________________________________");
System.out.println("\nDIGITE SOMENTE NÚMEROS!\n");
opcao = -1;
} catch (Exception e) {
System.out.println("________________________________________________________________");
System.out.println("ERRO: " + e);
e.printStackTrace();
opcao = -1;
}
} while (opcao != 0);
}
private void cadastrarCliente() {
System.out.println("\n*****CADASTRAR CLIENTE*****\n");
System.out.print("DIGITE O CPF DO CLIENTE: ");
String cpfCliente = scanner.nextLine();
System.out.print("\nDIGITE O NOME DO CLIENTE: ");
String nomeCliente = scanner.nextLine();
iOpCelularRemote.cadastrarCliente(cpfCliente, nomeCliente);
System.out.println("\nCLIENTE CADASTRADO COM SUCESSO!");
}
private void cadastrarTelefone() {
System.out.println("\n*****CADASTRAR TELEFONE*****\n");
System.out.print("DIGITE O CPF DO CLIENTE: ");
String cpfCliente = scanner.nextLine();
System.out.print("\nDIGITE O NÚMERO DO CELULAR: ");
String numeroCelular = scanner.nextLine();
iOpCelularRemote.cadastrarTelefone(cpfCliente, numeroCelular);
System.out.println("\nTELEFONE CADASTRADO COM SUCESSO!");
}
private void inserirCreditos() {
System.out.println("\n*****INSERIR CRÉDITOS*****\n");
System.out.print("DIGITE O CPF DO CLIENTE: ");
String cpfCliente = scanner.nextLine();
System.out.print("\nDIGITE O NÚMERO DO CELULAR: ");
String numeroCelular = scanner.nextLine();
System.out.print("\nDIGITE O VALOR DA RECARGA: ");
String valorRecarga = scanner.nextLine();
double valor = Double.parseDouble(valorRecarga);
iOpCelularRemote.inserirCredito(cpfCliente, numeroCelular, valor);
System.out.println("\nCRÉDITOS INSERIDOS COM SUCESSO!");
}
public static void main(String[] args) {
new Main().chamarOpcao();
}
}