Servlets 我可以添加一个带有自定义名称的JNDI绑定,以便在我的客户机Servlet上注入一个无状态Bean吗?
一方面,我有一个实现远程接口的无状态EJB BeanServlets 我可以添加一个带有自定义名称的JNDI绑定,以便在我的客户机Servlet上注入一个无状态Bean吗?,servlets,ejb,jndi,java-ee-6,inject,Servlets,Ejb,Jndi,Java Ee 6,Inject,一方面,我有一个实现远程接口的无状态EJB Bean @Stateless(name = "ejbBean") @Remote(TimedBean.class) public class TimedBeanImpl implements TimedBean ... 另一方面,我有一个Servlet客户端,我需要在其中注入这个ejbbean来调用它的操作。注入引用服务器自动生成的JNDI: public class LoadTimer implements Ser
@Stateless(name = "ejbBean")
@Remote(TimedBean.class)
public class TimedBeanImpl implements TimedBean
...
另一方面,我有一个Servlet客户端,我需要在其中注入这个ejbbean来调用它的操作。注入引用服务器自动生成的JNDI:
public class LoadTimer implements ServletContextListener {
// EAR Local Mapping - EAR Dev Mapping
// @EJB(mappedName = "java:global/appTest/appTestModuleOne-01.00.00/ejbBean")
@EJB(mappedName = "java:global/appTest-01.00.00/appTestModuleOne-01.00.00/ejbBean")
private TimedBean timedBean;
@Override
public void contextInitialized(ServletContextEvent servletcontextevent) {
...
它起作用了
但引用自动生成的jndi的事实使得解决方案高度依赖于特定环境:
- 这取决于服务器。例如,我的本地测试服务器是JBOSS 7.1,而我的开发服务器是JBOSS EAP 6.2,自动生成的jndi是不同的李>
- 这取决于包装。在EAR文件中部署的ejbBean与在WAR文件中部署的ejbBean不同李>
- 这取决于工件的版本。更多的变化
你好 您可以在application.xml中使用
,在模块描述符(web.xml或ejb jar.xml)中使用
,以减少硬编码的版本号。(注意,从EE 6开始,您应该使用@EJB(lookup=“…”)
而不是mappedName。)规范还要求您的应用程序服务器在部署应用程序时为您提供覆盖@EJB
引用的查找名称的选项,因此,开发时应用程序中的硬编码应该无关紧要。感谢@bkail的回复。事实上,他没有检查lookup属性。我考虑到了。除了您描述的这些缓解问题的机制之外,我还发现,如果使用表示法ejb,则无参数也可以恢复bean的实例。我知道如果远程接口有多个实现,这个解决方案是无效的,除此之外,我知道如何按缺陷进行查找。我会继续调查。