gpt4 book ai didi

jsf - 托管bean中的回滚事务

转载 作者:行者123 更新时间:2023-12-03 08:51:48 24 4
gpt4 key购买 nike

我想回滚事务不是在EJB内,而是在JSF托管Bean内。在EJB内部,我们可以使用SessionContext.setRollBackOnly(),但是我可以在托管bean中使用什么呢?

@Stateless
@Local(AccountLocal.class)
public class AccountBean implements AccountLocal {

public void test1() throws CustomException(){
...
}

public void test2() throws CustomException(){
...
throw new CustomException();
}

public void test3() throws CustomException(){
...
}

public void all() throws CustomException(){
test1();
test2();
test3();
}

}

在我的托管bean中:
@SessionScoped
public class LoginBean implements Serializable{

public void test(){

try{
accountBean.test1();
accountBean.test2();
accountBean.test3();
}catch(CustomException e){
// WHAT HERE TO ROLLBACK TRANSACTION ?
}
}
}

编辑:我如何确保 test1test2test3之一回滚,其他的也回滚?

我测试了此代码,即使 accountBean.test1();回滚, accountBean.test2();也得到了验证。

解决方案只能将这3个方法嵌套在一个EJB方法中吗?
 @SessionScoped
public class LoginBean implements Serializable{

public void test(){

try{
accountBean.all();
}catch(CustomException e){
...
}
}
}

最佳答案

如果引发了未经检查的异常,则EJB容器会自动回滚事务(请注意,JPA的PersistenceException就是这种情况)。您的CustomException似乎是已检查的异常。如果更改它以扩展RuntimeException,如下所示

public class CustomException extends RuntimeException {
// ...
}
或创建一个新的注解不是一种选择,那么您需要在 @ApplicationException属性设置为 rollback的类上设置 true 批注。
例如。
@ApplicationException(rollback=true)
public class CustomException extends Exception {
// ...
}
请注意,具体问题与JSF无关。服务层和事务管理完全不在JSF的职责范围之内。而是由EJB负责。在这种情况下,JSF应该仅充当“ View ”。
也可以看看:
  • JSF Service Layer
  • Handling service layer exception in Java EE frontend method
  • 关于jsf - 托管bean中的回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815620/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com