2011-07-18 61 views
4

我一直在寻找了一段时间,我无法找到一个解决办法,问题如下:注入JBOSS EJB到JSF 2.0托管bean在Tomcat Web应用程序运行

  1. 我有一个部署在jBoss 6.0中的EJB3应用程序,带有远程ejb。
  2. 我有一个在Tomcat 6.0中部署的Web应用程序(JSF 2.0)。

我不想在jBoss中运行tomcat web应用程序,它的应用程序 在tomcat下运行,并且架构应该保持不变。

我不想手动查找的EJB(我想它注入)换句话说,我不想做这样的:

Properties properties = new Properties();               
properties.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 
properties.setProperty("java.naming.provider.url", "jnp://localhost:1099");      
properties.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); 

Context c = new InitialContext();                 
MySB mySB = (MySB) c.lookup("MySB/remote"); 

我需要的是注入JBoss的EJB的到Tomcat应用程序管理的bean,例如

@EJB(name="MySB/remote") 
protected MySB mySB; 

仿佛MySB/remote是在tomcat本地JNDI,但实际上它正在从JBoss的JNDI查找幕后。

是可能的吗?

回答

1

你可以用CDI做到这一点。不幸的是,CDI支持并没有像Tomcat这样的标准servlet引擎,所以如果你想部署一个利用CDI注释的JSF应用程序,你需要实现CDI规范。 JSR 299的参考实现被称为Weld。要安装它,你需要:

1)把weld-servlet.jar到JSF应用程序

2)的WEB-INF\lib文件夹下面的监听器定义添加到您的web.xml

<listener> 
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class> 
</listener> 

3)添加一个空beans.xml file应用于WEB-INF文件夹中的web.xml和faces-config.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> 
</beans> 

最后,您需要在托管的bean中使用@Inject您的EJB。

希望这会有所帮助。

+0

例如,如果EJB的jboss下,它的jnp地址是jnp:// localhost:1099我应该在tomcat中配置它? –

+0

将远程EJB定义为资源(​​请参阅http://docs.jboss.org/weld/reference/1.0.0/en-US/html/resources.html#d0e4373),然后注入它 –