3.2.13.2. Seam 2.2 归档移植的问题
- Seam 2.2 Drools 和 Java 7 是不兼容的
- Seam 2.2 Drools 和 Java 7 是不兼容的且会抛出异常 org.drools.RuntimeDroolsException: value '1.7' is not a valid language level error。
- 签注了
cglib.jar
的 Seam 2.2.5 阻止了 Spring 例程的运行 - 当 Spring 例程使用 JBoss EAP 5 里 Seam 2.2.5 附带的签注的
cglib.jar
时,它会运行失败并带有下列错误:java.lang.SecurityException: class "org.jboss.seam.example.spring.UserService$$EnhancerByCGLIB$$7d6c3d12"'s signer information does not match signer information of other classes in the same package
解决办法是取消cglib.jar
的签注:zip -d $SEAM_DIR/lib/cglib.jar META-INF/JBOSSCOD\*
- Seambay 例程会抛出异常
NotLoggedInException
。 - 造成这个结果的原因是当处理 SOAPRequestHandler 里的消息时,SOAP 消息头部为空,从而未设置会话 ID。变通办法是像 https://issues.jboss.org/browse/JBPAPP-8376 里描述的那样,覆盖
org.jboss.seam.webservice.SOAPRequestHandler.handleOutbound
。 - Seambay 例程抛出异常
UnsupportedOperationException
:没有事务。 - 这个程序错误是由于修改 JBoss EAP 6 里的 UserTransaction 的 JNDI 名称而引起的。变通办法是像 https://issues.jboss.org/browse/JBPAPP-8322 里描述的那样,覆盖
org.jboss.seam.transaction.Transaction.getUserTransaction
。 - Tasks 例程抛出
org.jboss.resteasy.spi.UnhandledException
:无法解码请求的主体。 - 这个程序错误是由于 JBoss EAP 5.1.2 里包含的 seam-resteasy-2.2.5 和 JBoss EAP 6 里的 RESTEasy 2.3.1.GA 不兼容而引起的。解决办法是按照 https://issues.jboss.org/browse/JBPAPP-8315 里所描述的,使用
jboss-deployment-structure.xml
从主部署里排除 resteasy-jaxrs、resteasy-jettison-provider 和 resteasy-jaxb-provider,以及从jboss-seam-tasks.war
里排除 resteasy-jaxrs、resteasy-jettison-provider、resteasy-jaxb-provider 和 resteasy-yaml-provider。然后您需要在 EAR 里包含 Seam 2.2 附带的 RESTEasy 库。 - 在 AJAX 请求过程中
org.jboss.seam.core.SynchronizationInterceptor
和 stateful 组件实例 EJB 锁之间发生死锁。 - 显示错误页面 "Caused by javax.servlet.ServletException with message: "javax.el.ELException: /main.xhtml @36,71 value="#{hotelSearch.pageSize}": org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component: hotelSearch" 或类似的错误信息。问题是 Seam 2 在 stateful session bean(SFSB)锁外部进行锁定且使用不同的作用域。这意味着如果某个线程在相同的事务里两次访问了同一个 EJB,在第一次调用后,它将具有 SFSB 锁,而不是 Seam 的锁。然后另外一个线程可能获得 Seam 锁,这样将和 EJB 锁冲突并阻塞。当第一个线程开始第二次调用时,它将阻塞在 Seam 2 拦截器上并形成死锁。在 Java EE 5 里,EJB 遇到并发访问时将立即抛出异常。而在 JBoss EAP 6 里已经修改了这个行为。解决办法是在 EJB 里添加 @AccessTimeout(0)。这会使它在发生这种情况时立即抛出
ConcurrentAccessException
。 - Dvdstore 例程创建订单失败并抛出
javax.ejb.EJBTransactionRolledbackException
。 - dvdstore 例程显示了下列错误:
JBAS011437: Found extended persistence context in SFSB invocation call stack but that cannot be used because the transaction already has a transactional context associated with it. This can be avoided by changing application code, either eliminate the extended persistence context or the transactional context. See JPA spec 2.0 section 7.6.3.1.
这是由于 JPA 规格的改变而引起的。解决办法时修改CheckoutAction
和ShowOrdersAction
类里的持久化上下文为transactional
并在cancelOrder
和detailOrder
方法里使用实体管理者的合并操作。 - 在 JBoss EAP 6 里无法使用 Seam Cache 的提供者 JBoss Cache
- 在 JBoss EAP 6 里不支持 JBoss Cache。这导致应用服务器上的一个 Seam 程序里使用 JBoss Cache 时抛出异常:
java.lang.NoClassDefFoundError: org/jboss/util/xml/JBossEntityResolver
. - Hibernate 3.3.x 自动扫描 JBoss EAP 6 里 JPA 实体的问题。
- 解决办法时在 persistence.xml 文件里手动列出所有的实体类。例如:
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> <persistence-unit name="example_pu"> <description>Hibernate 3 Persistence Unit.</description> <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source> <properties> <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" /> </properties> <class>com.acme.Foo</class> <class>com.acme.Bar</class> </persistence-unit> </persistence>
- 从非 EJB 线程调用 EJB Seam 组件导致了 javax.naming.NameNotFoundException
- 这个问题是 JBoss EAP 里为实现新的模块化类加载系统和采用新的标准化 JNDI 命名空间规则而进行修改的结果。
java:app
命名空间是用于单个应用程序里所有组件共享的名称。非 EE 线程,如 Quartz 异步线程,必须使用java:global
命名空间,它是部署在应用服务器实例里的所有应用程序共享的。如果您试图从 Quartz 异步方法里调用 EJB Seam 组件时遇到javax.naming.NameNotFoundException
,您必须修改components.xml
文件来使用全局 JNDI 名称,例如:<component class="org.jboss.seam.example.quartz.MyBean" jndi-name="java:global/seam-quartz/quartz-ejb/myBean"/>
For more information on JNDI changes, refer to the following topic: 第 3.1.8.1 节 “更新应用程序 JNDI 命名空间的名称” . For more information on this specific issue, refer to BZ#948215 - Seam2.3 javax.naming.NameNotFoundException trying to call EJB Seam components from quartz asynchronous methods in the 2.2.0 Release Notes for Red Hat JBoss Web Framework Kit on the Red Hat Customer Portal.