2017-04-01 38 views
1

我一直在试图注入一个EJB到JAX-RS资源通过InitialContext()lookup()收到以下异常:中的NameNotFoundException JAX-RS注入EJB种源

<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]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.

罐子shared.jar是战争项目的依赖,但似乎该位置不正确。我必须将这些软件包也添加到ejb-link吗?

喜欢的东西:<ejb-link>shared.jar#com.x.y.ServiceImpl</ejb-link>

我ASLO需要指出的是,有一种HK2,CDI和查找作为注入的部分混合由于该项目是很老,也有人迁移到WebLogic 12c版最近如此正常@Inject@EJB似乎没有工作。

+0

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

回答

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

嗨Leonardo,感谢您的回应,我添加了该片段,但现在它说ejb链接不正确,我已经更新了包含此问题的问题。 –

+0

尝试给ejb一个名字,比如'@EJB(name =“adminXProfileService”)'然后在ejb链接中完全引用它。 – Leonardo