NameNotFoundException 在 JAX-RS 资源中注入 EJB

NameNotFoundException injecting EJB in JAX-RS Resouce

我一直在尝试将 EJB 注入 JAX-RS 资源 通过 InitialContext()lookup() 得到以下异常:

    <javax.naming.NameNotFoundException: While trying to look up 
comp/env/AServiceLocal
in /app/webapp/wcc/1377099157.; remaining name 'comp/env/AServiceLocal'> 

我在资源构造函数中的查找:

try {

    initialContext = new InitialContext();          
    String jndiSubcontext = "java:comp/env/";

    aService = (AServiceLocal) initialContext.lookup(jndiSubcontext+AServiceLocal.class.getSimpleName());
    eSService = (ESServiceLocal) initialContext.lookup(jndiSubcontext+ESServiceLocal.class.getSimpleName());
    eService = (EServiceLocal) initialContext.lookup(jndiSubcontext+EServiceLocal.class.getSimpleName());

} catch (NamingException e) {
    e.printStackTrace();
}

考虑到它们都是 Maven 项目,这是文件结构:

global
|
--shared
  |
  |---src/main/java/com/x/y/z/AServiceLocal.java (ejb)
|
--war-project
  |
  |--src/main/java/comm/x/y/z/TheResource.java (jax-rs)

相关的maven项目比较多,都是通过全局项目分层maven配置的

在与 war-project 相同的项目中还有一个 resource 也执行对 shared 项目的查找,他们 工作。

我不明白是什么问题。

编辑

ejb-local-ref 添加到部署描述符后:

<ejb-local-ref>
    <ejb-ref-name>AServiceLocal</ejb-ref-name>
    <ejb-ref-type>Session</ejb-ref-type>
    <local>com.x.y.service.AdminXProfileServiceLocal</local>
    <ejb-link>shared.jar#AdminXProfileService</ejb-link>
</ejb-local-ref>

我收到以下错误:

[J2EE:160101]Error: The ejb-link "shared.jar#AService" declared in the ejb-ref or ejb-local-ref "AServiceLocal" in the application module "xyz-99.1.0-SNAPSHOT.war" could not be resolved. The target EJB for the ejb-ref could not be found. Ensure that the link is correct.

jar shared.jar 是war 项目的依赖项,但似乎位置不正确。我还必须将软件包添加到 ejb-link 吗?

类似于:<ejb-link>shared.jar#com.x.y.ServiceImpl</ejb-link>

我还需要指出的是,由于该项目很旧并且最近已迁移到 weblogic 12c 版本,所以注入过程中混合了 hk2、cdi 和查找 @Inject@EJB 似乎不起作用。

如果我考虑到我看到的所有变量,如 Maven、项目结构、JNDI 查找等...最好的方法是在 war 的 web.xml 中添加一个条目引用您的 ejbs 的项目。

<ejb-local-ref>
   <ejb-ref-name>ejb/adminXProfileService</ejb-ref-name>
   <ejb-ref-type>Session</ejb-ref-type>
   <local>com.myapp.ejb.AdminXProfileServiceLocal</local>
   <ejb-link>YourEJBLibrary.jar#adminXProfileService</ejb-link>
</ejb-local-ref>

然后在您的查找中,您只需查找:

contenxt.lookup("java:comp/env/ejb/adminXProfileService");