我一直试图通过 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
似乎没有工作。
答案 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");