【发布时间】: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 吗?
类似:<ejb-link>shared.jar#com.x.y.ServiceImpl</ejb-link>
我还需要指出,作为注入的一部分,hk2、cdi 和查找是混合的,因为该项目已经很老了,而且它最近被迁移到 weblogic 12c 版本,所以很正常@Inject 或@EJB 似乎没有工作。
【问题讨论】:
-
你在哪里打包shared.jar?您是将其打包在 EAR 中,还是依赖 EJB-in-WAR(从 EJB 3.1 开始添加)?
标签: jax-rs ejb-3.0 jersey-2.0