【问题标题】:Consuming local EJB, in the same Container but different ears使用本地 EJB,在同一个 Container 但不同耳朵
【发布时间】:2011-11-20 17:24:25
【问题描述】:

我正在尝试在同一个 Glassfish 中使用本地 EJB,但耳朵不同。但是 Glassfish 找不到本地 EJB 或者无法消费

我读到这个: 根据 JavaEE 教程,@Local bean 的客户端“必须在与其访问的企业 bean 相同的 JVM 中运行。”

在第一只耳朵, 我在 jar 中有本地接口

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

在另一个罐子里,我有实现

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

在第二只耳朵, 在同一个玻璃鱼中

我在一个罐子里有本地接口

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

在另一个罐子里,我有消费者

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

使用@EJB 和 (name="MyLocalBeanImpl") 参数,错误是:

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

使用@EJB 和 (name="my.package.MyLocalBeanImpl") 参数,错误是:

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|#]***

我也尝试过使用 mappedName

    @Stateless(name="MyLocalBeanImpl",mappedName ="MyLocalBeanImpl")
    public class MyLocalBeanImpl implements MyLocalBean{

@EJB(name="MyLocalBeanImpl",mappedName ="MyLocalBeanImpl")
private MyLocalBean beanlocal;

但错误仍然存​​在

 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 与 JNDI 类似

 java:global[/<app-name>]/<module-name>/<bean-name>

我在 bean MyLocalBeanImpl 中添加了注解 @LocalBean

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

当我部署 Glassfish 时说 jndi 是两个

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

我正在尝试

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

Glassfish 似乎找到了 Local Bean,但是……Glassfish 在投射类似的东西时遇到问题

 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__

并尝试

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

我明白了:

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}

【问题讨论】:

  • “本地 EJB”中的“本地”表示“本地到您的应用程序”。合并 EAR 或使其成为远程 EJB。
  • 在《EJB3 开发人员指南》一书中说:请注意,我们在接口定义前面加上了@Remote 注释。这向 EJB 容器表明该 bean 可能被远程客户端调用。 远程是指与容器不在同一个 Java 虚拟机 (JVM) 中的客户端。 好消息是,如果客户端从应用程序内部运行,我们可以完全省去 JNDI客户端容器 (ACC)。
  • 检查解决您问题的方法之一:stackoverflow.com/questions/13512028/…

标签: java jakarta-ee ejb ejb-3.0 glassfish-3


【解决方案1】:

可以将本地 EJB 注入同一 JVM 但不同耳朵的另一个 EJB。

问题是您不能再依赖 bean 的名称,因为您需要告诉消费者 bean 完整的 JNDI 名称。您可以在部署期间在服务器日志中找到此名称;当 bean 绑定到 JNDI 目录时,服务器会在日志中显示它。

【讨论】:

  • 谢谢贡萨洛。 GlassFish 与 java:global[/]// 之类的 JNDI 一起使用我将注释 @LocalBean 添加到我正在尝试使用 @EJB(lookup=" java:global/myfirstear/myejbs/MyLocalBeanImpl!my.package.MyLocalBeanImpl") 看来 Glassfish 找到了 Local Bean,但是...
  • Glassfish 在转换类似 javax.naming.NamingException javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB at com.sun.ejb.containers.StatelessSessionContainer._getContext 时遇到问题(StatelessSessionContainer.java:454) ..... 原因:javax.ejb.EJBException: javax.ejb.CreateException: 无法创建无状态 EJB ....
  • 引起:com.sun.enterprise.container.common.spi.util.InjectionException: 尝试注入本地ejb-ref name=my.package.BeanConsumer/beanlocal,Local 3.x接口的异常=my.package.MyLocalBean,ejb-link=null,lookup=java:global/myfirstear/myejbs/MyLocalBeanImpl!my.package.MyLocalBeanImpl,mappedName=,jndi-name=,refType=会话到 my.package.BeanConsumer 类:无法将 my.package.MyLocalBean 字段 my.package.BeanConsumer.beanlocal 设置为 my.package.beans.__EJB31_Generated__MyLocalBeanImpl__Intf____Bean__
  • 你试过/]//吗?如果您还可以更新很棒的线程问题,那么在评论中阅读异常并不容易;)
猜你喜欢
  • 2014-09-23
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多