4.3.3. 移植 Seam 2.2 Booking 例程到 JBoss EAP 6
介绍
Seam 2.2 Booking EAR 移植比 Seam 2.2 JPA WAR 更为复杂。在 第 4.3.2 节 “移植 Seam 2.2 JPA 例程到 JBoss EAP 6” 里可以找到 Seam 2.2 JPA WAR 例程移植的文档。要移植这个程序,您必须:
- 初始化 JSF 1.2 而不是默认的 JSF 2。
- 捆绑旧版的 Hibernate JAR 而不是使用 JBoss EAP 6 附带的版本。
- 修改 JNDI 绑定以使用新的 Java EE 6 JNDI 可移植的语法。
重要
直接使用 Hibernate 的 Seam 2.2 应用程序可以使用包裹在应用程序里的一个 Hibernate 3 版本。而通过 JBoss EAP 6 的 org.hibernate 模块提供的 Hibernate 4,不被 Seam 2.2 支持。这个例子将帮助您在 JBoss EAp 6 运行应用程序。请注意,将 Hibernate 3 包裹在 Seam 2.2 应用程序不是被支持的配置。
过程 4.7. 移植 Seam 2.2 Booking 例程
创建
jboss-deployment-structure.xml
文件在jboss-seam-booking.ear/META-INF/
里创建一个名为jboss-deployment-structure.xml
的文件并添加下列内容:<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> <deployment> <dependencies> <module name="javax.faces.api" slot="1.2" export="true"/> <module name="com.sun.jsf-impl" slot="1.2" export="true"/> <module name="org.apache.log4j" export="true"/> <module name="org.dom4j" export="true"/> <module name="org.apache.commons.logging" export="true"/> <module name="org.apache.commons.collections" export="true"/> </dependencies> <exclusions> <module name="org.hibernate" slot="main"/> </exclusions> </deployment> <sub-deployment name="jboss-seam-booking.war"> <exclusions> <module name="javax.faces.api" slot="main"/> <module name="com.sun.jsf-impl" slot="main"/> </exclusions> <dependencies> <module name="javax.faces.api" slot="1.2"/> <module name="com.sun.jsf-impl" slot="1.2"/> </dependencies> </sub-deployment> </jboss-deployment-structure>
像下面这样修改
jboss-seam-booking.jar/META-INF/persistence.xml
文件。- 删除或注释 cache provider 类的 hibernate 属性:
<!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
- 在
jboss-seam-booking.jar/META-INF/persistence.xml
文件里添加 Provider Module 属性:<property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
- 修改
jta-data-source
属性以使用默认的 JDBC 数据源 JNDI 名称:<jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
从 Seam 2.2 复制 JAR 文件
从 Seam 2.2 的EAP5.x_HOME/jboss-eap5.x/seam/lib/
目录复制下列 JAR 到jboss-seam-booking.ear/lib
目录:antlr.jar slf4j-api.jar slf4j-log4j12.jar hibernate-core.jar hibernate-entitymanager.jar hibernate-validator.jar hibernate-annotations.jar hibernate-commons-annotations.jar
修改 JNDI 查找名称
修改jboss-seam-booking.war/WEB-INF/components.xml
文件里的 JNDI 查找字符串。由于新的 JNDI 可移植规则,JBoss EAP 6 现在使用 JNDI 可移植语法规则绑定 EJB,您无法使用 JBoss EAP 5 里使用的单个的 jndiPattern。应用程序的 EJB JNDI 查找字符串必须修改成:java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching java:app/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching java:module/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction java:app/jboss-seam-booking/HotelSearchingAction java:module/HotelSearchingAction
Seam 2.2 框架 EJB 的 NDI 查找字符串必须修改成:java:global/jboss-seam-booking/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations java:app/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations java:module/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations java:global/jboss-seam-booking/jboss-seam/EjbSynchronizations java:app/jboss-seam/EjbSynchronizations java:module/EjbSynchronizations
您可以使用下列方式中的一个:添加组件元素
您可以为每个 EJB 添加一个jndi-name
至WEB-INF/components.xml
:<component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/> <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/> <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking/AuthenticatorAction" /> <component class="org.jboss.seam.example.booking.BookingListAction" jndi-name="java:app/jboss-seam-booking/BookingListAction" /> <component class="org.jboss.seam.example.booking.RegisterAction" jndi-name="java:app/jboss-seam-booking/RegisterAction" /> <component class="org.jboss.seam.example.booking.HotelSearchingAction" jndi-name="java:app/jboss-seam-booking/HotelSearchingAction" /> <component class="org.jboss.seam.example.booking.HotelBookingAction" jndi-name="java:app/jboss-seam-booking/HotelBookingAction" /> <component class="org.jboss.seam.example.booking.ChangePasswordAction" jndi-name="java:app/jboss-seam-booking/ChangePasswordAction" />
- 您可以修改代码,添加
@JNDIName(value="")
注解指定 JNDI 路径。下面时一个已修改的 stateless session bean 代码示例。关于这个产品的详细说明可以在 Seam 2.2 的参考文档里找到。@Stateless @Name("authenticator") @JndiName(value="java:app/jboss-seam-booking/AuthenticatorAction") public class AuthenticatorAction implements Authenticator { ... }
结果:
Seam 2.2 Booking 例程在 JBoss EAP 6 上成功部署和运行。