2013-06-24 37 views
3

I'can't訪問我的@EJB異常時,因爲此異常的訪問EJB從我管理的bean(在JSF頁面中使用)託管bean

javax.ejb.EJBTransactionRequiredException:交易是用於調用需要:[email protected]

JSF的部分(頁面-配置和web.xml)是在不同的包作爲豆的一部分,但兩者在部署了EAR。該應用程序部署在JBoss 7

EJB(企業):

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

託管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> 

感謝的對你有所幫助

回答

2

根據對TransactionAttributeType.MANDATORY EJB規範:

如果一個客戶端調用企業Bean的方法,同時在客戶端與事務上下文,容器調用相關企業bean的方法在客戶端的事務上下文中。 如果沒有現有的事務,則拋出異常。

當你的「客戶」(管理bean)一直沒有啓動的事務,EJB容器拋出一個異常,因爲你已經有TransactionAttributeType.MANDATORY註解會話bean。

而不是使用MANDATORY作爲@TransactionAttribute的值,請使用REQUIRED,因爲如果沒有現存的容器,這將強制容器啓動事務。關於TransactionAttributeType.REQUIRED規範說以下內容:

如果一個客戶端調用企業Bean的方法,而該客戶端是與事務上下文關聯 ,容器調用 企業Bean的客戶端的事務上下文的方法。

如果客戶機調用企業Bean的方法,而客戶端 不與事務上下文關聯,容器自動 委託方法調用 企業bean方法之前啓動一個新事務。