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");
我一直在尝试将 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");