NameNotFoundException在JAX-RS资源中注入EJB

时间:2017-04-01 22:33:38

标签: jax-rs ejb-3.0 jersey-2.0

我一直试图通过 InitialContext()lookup()将EJB注入到JAX-RS资源中,但获得以下异常:

    <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相同的项目中还有资源,它还会对shared项目执行查找,并且执行工作。< / p>

我不明白问题所在。

修改

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]错误:ejb-link&#34; shared.jar#AService&#34;   在ejb-ref或ejb-local-ref&#34; AServiceLocal&#34;中声明   在应用程序模块&#34; xyz-99.1.0-SNAPSHOT.war&#34;不可能   解决。无法找到ejb-ref的目标EJB。确保   链接是正确的。

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

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

我还需要指出hk2,cdi和lookups混合作为注入的一部分,因为项目已经很老了,而且它最近已迁移到weblogic 12c版本,所以正常{{1}或@Inject似乎没有工作。

1 个答案:

答案 0 :(得分:1)

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

<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");