Consumindo EJB local, no mesmo contêiner, mas ouvidos diferentes

Estou tentando consumir um EJB Local no mesmo Glassfish, mas ouvidos diferentes. Mas Glassfish não pode encontrar o EJB local ou não pode consumir

Eu li isso: de acordo com o tutorial JavaEE, o cliente de um bean @Local “deve ser executado na mesma JVM que o bean corporativo que ele acessa.”

Na primeira orelha , eu tenho a interface local dentro de uma jarra

@Local public interface MyLocalBean { int getNumber(int num3); } 

Em outro jar, eu tenho a implementação

 @Stateless @LocalBean public class MyLocalBeanImpl implements MyLocalBean,Serializable{ public MyLocalBeanImpl() {} public int getNumber(int num3){...... 

No segundo ouvido , no mesmo Glassfish

Eu tenho a interface local dentro de um flask

 @Local public interface MyLocalBean { int getNumber(int num3); } 

Em outro jarro, eu tenho o consumidor

 @Stateless @LocalBean public class BeanConsumer{ @EJB(name="MyLocalBeanImpl") private MyLocalBean beanlocal; 

com o parâmetro @EJB e (name = “MyLocalBeanImpl”) o erro é:

 Cannot resolve reference Local ejb-ref name=MyLocalBeanImpl,Local 3.x interface =my.package.MyLocalBean,ejb-link=null,lookup=, mappedName=,jndi-name=,refType=Session|#] 

com o parâmetro @EJB e (name = “my.package.MyLocalBeanImpl”) o erro é:

 Cannot resolve reference Local ejb-ref name=my.package.MyLocalBeanImpl, Local 3.x interface =my.package.MyLocalBean,ejb-link=null, lookup=,mappedName=,jndi-name=,refType=Session|#]*** 

Eu tentei também com mappedName

  @Stateless(name="MyLocalBeanImpl",mappedName ="MyLocalBeanImpl") public class MyLocalBeanImpl implements MyLocalBean{ @EJB(name="MyLocalBeanImpl",mappedName ="MyLocalBeanImpl") private MyLocalBean beanlocal; 

mas o erro persistir

  Cannot resolve reference Local ejb-ref name=MyLocalBeanImpl, Local 3.x interface =my.package.MyLocalBean,ejb-link=null, lookup=,mappedName=MyLocalBeanImpl,jndi-name=,refType=Session 

GlassFish trabalha com um JNDI como

  java:global[/]// 

Adicionei a anotação @LocalBean ao bean MyLocalBeanImpl

 @Stateless @LocalBean public class MyLocalBeanImpl implements MyLocalBean{ public MyLocalBeanImpl() {} public int getNumber(int num3){...... 

e quando eu implantei Glassfish dizer o jndi são dois

  Portable JNDI names for EJB OtroBean java:global/myfirstear/myejbs/MyLocalBeanImpl!my.package.MyLocalBeanImpl and java:global/myfirstear/myejbs/MyLocalBeanImpl!my.package.MyLocalBean 

estou tentando com

  @EJB(lookup="java:global/myfirstear/myejbs/MyLocalBeanImpl!my.package.MyLocalBeanImpl") 

Parece que Glassfish encontrou o Feijão Local, mas … Glassfish tem problemas em fundir algo assim

  javax.naming.NamingException javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB at com.sun.ejb.containers.StatelessSessionContainer ._getContext(StatelessSessionContainer.java:454) ..... Caused by: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB .... Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Local ejb-ref name=my.package.BeanConsumer/beanlocal, Local 3.x interface =my.package.MyLocalBean,ejb-link=null, lookup=java:global/myfirstear/myejbs/MyLocalBeanImpl!my.package.MyLocalBeanImpl, mappedName=,jndi-name=,refType=Session into class my.package.BeanConsumer: Can not set my.package.MyLocalBean field my.package.BeanConsumer.beanlocal to my.package.beans.__EJB31_Generated__MyLocalBeanImpl__Intf____Bean__ 

E tentando com

  @EJB(lookup="java:global/myfirstear/myejbs/MyLocalBeanImpl") 

Eu recebo:

 throws javax.naming.NamingException javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Local ejb-ref name=my.package.BeanConsumer/beanlocal, Local 3.x interface =my.package.MyLocalBean, ejb-link=null, lookup=java:global/myfirstear/myejbs/MyLocalBeanImpl, mappedName=,jndi-name=,refType=Session into class my.package.BeanConsumer: Lookup failed for 'java:comp/env/my.package.BeanConsumer/beanlocal' 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} 

É possível injetar um EJB local em outro EJB na mesma JVM, mas em diferentes ouvidos.

O problema é que você não pode mais confiar no nome do bean, já que precisa informar ao bean de consumidor o nome completo da JNDI. Você pode encontrar esse nome nos logs do servidor durante a implantação; no momento em que o bean é ligado ao diretório JNDI, o servidor o exibe nos logs.