【问题标题】:NameNotFoundException injecting EJB in JAX-RS ResouceNameNotFoundException 在 JAX-RS 资源中注入 EJB
【发布时间】:2017-04-01 22:33:37
【问题描述】:

我一直在尝试将 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 相同的项目中还有一个资源,它也执行对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]错误:ejb 链接“shared.jar#AService” 在 ejb-ref 或 ejb-local-ref "AServiceLocal" 中声明 在应用程序模块“xyz-99.1.0-SNAPSHOT.war”中不能 解决。找不到 ejb-ref 的目标 EJB。确保 链接是正确的。

jarshared.jar是war项目的一个依赖,但是好像位置不对。我必须将包也添加到ejb-link 吗?

类似:&lt;ejb-link&gt;shared.jar#com.x.y.ServiceImpl&lt;/ejb-link&gt;

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

【问题讨论】:

  • 你在哪里打包shared.jar?您是将其打包在 EAR 中,还是依赖 EJB-in-WAR(从 EJB 3.1 开始添加)?

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


【解决方案1】:

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

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

【讨论】:

  • 嗨莱昂纳多,感谢您的回复,我添加了 sn-p 但现在它说 ejb 链接不正确,我已更新问题以包含此内容。
  • 尝试为 ejb 命名,例如 @EJB(name="adminXProfileService"),然后在 ejb 链接中准确引用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 2019-03-01
  • 2015-05-05
  • 1970-01-01
相关资源
最近更新 更多