1

我在类中使用 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在 之前抛出an 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)
4

1 回答 1

2

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

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

最重要的是,事务应该在该 EJB 的 createCustomer() 方法中完成,而不是在托管 bean 中。

试试看!

于 2013-10-11T14:12:54.557 回答