【问题标题】:CreateException and NamingException after trying to inject one EJB into another尝试将一个 EJB 注入另一个 EJB 后的 CreateException 和 NamingException
【发布时间】:2011-12-28 02:36:12
【问题描述】:

我将 JEE6 与 Glassfish 3.1 和 Eclipse helios 一起使用。我一直在使用数据库运行几个 EJB、servlet 和 JPA。现在我只是尝试创建另一个 EJB @Statless 和 @LocalBean。当我将这个 bean 注入另一个 bean 以便我可以从那里调用它时,我得到了部署错误。

  [#|2011-12-27T19:15:14.703-0700|SEVERE|glassfish3.1.1|javax.enterprise.system.tools.ad    min.org.glassfish.deployment.admin|_ThreadID=19;_ThreadName=Thread-2;|
Exception while loading the app : javax.ejb.CreateException: Initialization      failed for Singleton Driver
javax.ejb.CreateException: Initialization failed for Singleton Driver
    at     com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:547)
    at     com.sun.ejb.containers.AbstractSingletonContainer.access$100(AbstractSingletonContainer.java:79)

还有

com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:376)
    at com.sun.ejb.containers.AbstractSingletonContainer.createSingletonEJB(AbstractSingletonContainer.java:538)
    ... 38 more
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)
    ... 63 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)

最后:

Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=com.logic.bean/tclient,Remote 3.x interface =com.thrift.ThriftClient,ejb-link=null,lookup=,mappedName=,jndi-name=com.thrift.ThriftClient,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.thrift.ThriftClient#com.thrift.ThriftClient' [Root exception is javax.naming.NamingException: Lookup failed for 'com.thrift.ThriftClient#com.thrift.ThriftClient' 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: com.thrift.ThriftClient#com.thrift.ThriftClient not found]]
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:178)
    at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1106)

这是新的 EJB 代码:

...imports...
@Stateless
@LocalBean
public class ThriftClient {


public ThriftClient(){}

...other code....

以及我如何注入它:

@EJB ThriftClient tclient;

我将它注入另一个具有其他 EJB 注入工作的无状态 bean。

【问题讨论】:

  • 可能与stackoverflow.com/questions/1620803/… 相关,仍在研究中。
  • 我正在查看客户端模块,那里没有生成任何内容。 EJB接口不应该添加到项目中的这个文件夹吗?

标签: jakarta-ee ejb


【解决方案1】:

检查 Glassfish 控制台是否正确部署了 bean 以及在什么 JNDI 名称下。我知道它应该开箱即用,但也许值得使用 @EJB 注释参数来使其指向正确的 JNDI 名称。这可以帮助您找到真正的问题,因为它显然与 JNDI 命名有关。您也可以尝试通过显式 JNDI 查找而不是注入它来查找 bean,然后您可能会注意到问题。

【讨论】:

  • 我在尝试部署时遇到错误,说要检查服务器日志。
  • 无法部署 XRSSear 模块部署错误:XRSSear:部署期间发生错误:加载应用程序时出现异常:javax.ejb.CreateException:单例驱动程序初始化失败。有关详细信息,请参阅 server.log。
  • 是像@EJB (name = /...name)这样的EJB注解参数
  • 使用 JNDI 查找至少可以阻止编译和部署错误。但我认为我在运行时可能会遇到一些问题,因为它没有检查查找地址字符串。事实上,我很确定我输入的不是 bean 的正确完全限定位置......
  • 我怀疑通过删除 CDI 不再出现编译或部署和服务器错误,但现在当我尝试使用 JNDI 引用的资源时,它在运行时根本无法正常工作。我会将您的答案标记为正确,因为它很可能是一些命名或参考问题,但我还没有解决我的问题,所以我会用新信息提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多