从托管bean访问ejb时出现异常

时间:2013-06-24 06:30:09

标签: jsf ejb jboss7.x managed-bean

由于此异常,我无法从托管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>

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

根据TransactionAttributeType.MANDATORY的EJB规范:

  

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

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

不使用MANDATORY作为@TransactionAttribute的值,而是使用REQUIRED,因为这会强制容器启动事务(如果没有现有事务)。关于TransactionAttributeType.REQUIRED的规范说明如下:

  

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

     

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