由于此异常,我无法从托管bean(从jsf页面使用)访问我的@EJB
javax.ejb.EJBTransactionRequiredException:调用需要事务:org.jboss.invocation.InterceptorContext@353e531e
jsf部分(pages faces-config和web.xml)与bean部分位于不同的包中,但两个部署在EAR中。该应用程序部署在jboss 7
上EJB(业务):
@Stateful
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class DataAccessBusinessImpl implements DataAccessBusiness {
Managed Bean:
public class ConfigurationBean implements Serializable {
@EJB
DataAccessBusiness dab;
faces-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>
的web.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>
感谢您的帮助
答案 0 :(得分:2)
根据TransactionAttributeType.MANDATORY
的EJB规范:
如果客户端在事务上下文关联时调用企业bean的方法,则容器在客户端的事务上下文中调用企业bean的方法。 如果没有现有事务,则抛出异常。
由于您的“客户端”(托管bean)没有启动事务,EJB容器会抛出异常,因为您已使用TransactionAttributeType.MANDATORY
注释了会话bean。
不使用MANDATORY
作为@TransactionAttribute的值,而是使用REQUIRED
,因为这会强制容器启动事务(如果没有现有事务)。关于TransactionAttributeType.REQUIRED
的规范说明如下:
如果客户端在客户端调用企业bean的方法 与事务上下文相关联,容器调用 客户端事务上下文中的enterprise bean方法。
如果客户端在客户端调用企业bean的方法 与事务上下文无关,容器自动 在将方法调用委托给之前启动一个新事务 企业bean方法。