将一个jBoss EJB注入到运行在Tomcat Web应用程序中的JSF 2.0托管Bean中

4

我已经寻找了一段时间,但是一直没有找到解决方案,问题如下:

  1. 我有一个使用 EJB3 编写的应用程序部署在 jBoss 6.0 上,并且包含远程 ejb。
  2. 我有一个使用 JSF 2.0 编写的 Web 应用程序部署在 Tomcat 6.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个回答

1

您可以使用CDI来完成此操作。不幸的是,CDI支持并不随着像Tomcat这样的标准servlet引擎一起发布,因此如果您想部署利用CDI注释的JSF应用程序,您需要获取CDI规范的实现。 JSR 299的参考实现称为Weld。要安装它,您需要:

1)将weld-servlet.jar放置到JSF应用程序的 WEB-INF \ lib 文件夹中

2)将以下监听器定义添加到您的 web.xml 中:

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

3) 在应用程序的 WEB-INF 文件夹中,与 web.xml 和 faces-config.xml 文件一起添加一个空的 beans.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。

希望这可以帮助到您。


例如,如果EJB在jboss下,并且其jnp地址为jnp://localhost:1099,我应该在tomcat中配置在哪里? - Omar Al Kababji
将远程EJB定义为资源(请参见http://docs.jboss.org/weld/reference/1.0.0/en-US/html/resources.html#d0e4373),然后注入它。 - Jon Onstott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接