@ManagedBean类中的回滚失败

时间:2013-10-11 08:18:19

标签: java jsf jsf-2 ejb-3.0 ejb-3.1

我在@ManagedBean类中使用Bean管理的事务来手动管理事务,

@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)

1 个答案:

答案 0 :(得分:2)

我认为你有这个例外,因为事务在EJB容器范围之外。 JSF应用程序是EJB服务客户端,应用程序位于WEB容器范围内。

通常,您不在JSF托管bean中执行任何业务逻辑。托管bean只是JSF ModelViewController体系结构中的控制器。业务逻辑应该在ejb中完成,并将它们注入JSF托管bean中,并且只使用该功能调用EJB方法。事务,持久性,安全性等应该在EJB内部完成。

从底线开始,事务应该在该EJB内部的createCustomer()方法内完成,而不是在托管bean中完成。

试试吧!