3

由于此异常,我无法从托管 bean(从 jsf 页面使用)访问我的 @EJB

javax.ejb.EJBTransactionRequiredException:调用需要事务:​​org.jboss.invocation.InterceptorContext@353e531e

jsf 部分(页面 faces-config 和 web.xml)与 bean 部分位于不同的包中,但其中两个位于已部署的 EAR 中。此应用程序部署在 jboss 7 上

EJB(商业):

@Stateful
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class DataAccessBusinessImpl implements DataAccessBusiness {

托管豆:

public class ConfigurationBean implements Serializable {
    @EJB
    DataAccessBusiness dab;

面孔-config.xml:

<managed-bean>
<managed-bean-name>configurationBean</managed-bean-name>
<managed-bean-class>ch.morphean.videoaid.lb.managedBean.ConfigurationBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>

网页.xml:

<display-name>videoaid-site</display-name>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

谢谢你的帮助

4

1 回答 1

2

根据 EJB 规范TransactionAttributeType.MANDATORY

如果客户端在客户端与事务上下文相关联时调用企业 bean 的方法,则容器在客户端的事务上下文中调用企业 bean 的方法。如果没有现有事务,则抛出异常。

由于您的“客户端”(托管 bean)没有启动事务,因此 EJB 容器会抛出异常,因为您已使用TransactionAttributeType.MANDATORY.

而不是使用MANDATORY作为@TransactionAttribute 的值,使用REQUIREDas 这将强制容器在没有现有事务的情况下启动事务。关于规范TransactionAttributeType.REQUIRED的内容如下:

如果客户端在客户端与事务上下文相关联时调用企业 bean 的方法,则容器在客户端的事务上下文中调用企业 bean 的方法。

如果客户端调用企业 bean 的方法,而客户端没有与事务上下文相关联,则容器会在将方法调用委托给企业 bean 方法之前自动启动一个新事务。

于 2013-06-24T10:46:18.293 回答