2013-10-11 61 views
1

我用裏面@ManagedBean類Bean管理的事務手動管理事務中失敗,回滾@ManagedBean類

@ManagedBean(name = "clients") 
@ViewScoped 
@URLMapping(id = "sousc", pattern = "/ccf_sicavs_customers", viewId = "/customers/PgSouscripteurs.jsf") 
@TransactionManagement(TransactionManagementType.BEAN) 
public class SouscripteursBean extends Referentiel implements Serializable { 
@Resource 
    private UserTransaction ut; 
    @EJB 
private CustomerDaoLocal ejbCust; 
public void createCustomer() { 
try { 
        LOGGER.info("Debut de la transaction"); 
        ut.begin(); 
        LOGGER.info("begin() succeded"); 
        currentMorale.setCodeSouscripteur("25"); 
        saved=ejbCust.createCustomer(currentMorale); 
        ut.commit(); 
        LOGGER.info("commit() succeded"); 
       } catch (Exception e) { 
        saved=false; 
        try { 
         ut.rollback(); 
         LOGGER.info("rollback() succeded"); 
        } catch (Exception ex) { 
         LOGGER.log(Level.SEVERE,null,ex); 
        } 
       } 
} 
} 

但如果exception時引發的commit()之前拋出,rollback()失敗 並拋出這個java.lang.IllegalStateException

SEVERE: java.lang.IllegalStateException: Transaction is not active in the current thread. 
    at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.validateTransactionManager(JavaEETransactionManagerJTSDelegate.java:447) 
    at com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate.rollbackDistributedTransaction(JavaEETransactionManagerJTSDelegate.java:208) 
    at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.rollback(JavaEETransactionManagerSimplified.java:899) 
    at com.sun.enterprise.transaction.UserTransactionImpl.rollback(UserTransactionImpl.java:234) 

回答

2

我認爲你有這個異常,因爲事務處在EJB容器範圍之外。 JSF應用程序是EJB服務客戶端,應用程序位於WEB Container範圍內。

通常,您不會在JSF託管bean中執行任何業務邏輯。託管bean只是JSF ModelViewController體系結構中的控制器。業務邏輯應該在ejb的內部完成,並將它們注入到JSF託管的bean中,並僅使用該功能調用EJB方法。事務,持久性,安全性等應該在EJB內完成。底線,事務應該在來自該EJB的createCustomer()方法內完成,而不是在託管bean內完成。

試試看!