使用Db.tx提交事务,return false 事务回滚之后。

使用Db.tx提交事务,return false 事务回滚之后。为什么不执行后续代码,后台直接报错: java.io.FileNotFoundException: Template "/admin2/szfz/save.html"

public void wstkCx(BaseController cl,final long tkid) {

final String msg []= { "撤销失败!"};

boolean tx = Db.tx(new IAtom() {

boolean flag;

@Override

public boolean run() throws SQLException {

WstkFq wstkFq = WstkFq.dao.findById(tkid);

wstkFq.set("scbz", "1");

flag = wstkFq.update();

if(!flag) {

return flag;

}

//发送短信

String ajid = wstkFq.getStr("ajid");

String dsrid = String.valueOf(wstkFq.getInt("tkr"));

String lxdh = AjDsrxxZhywxt.dao.queryLxdhByLaoid(ajid,dsrid);

String dsrmc = AjDsrxxZhywxt.dao.queryDsrmcByLaoid(ajid,dsrid);

try {

String code = SendMessageMW.sendMsg(lxdh, "您好,由于款项问题不能退款!");

/*if(!"ok".equals(code)) {

msg[0] = "短信发送失败";

flag  = false;

return flag;

}*/

} catch (HttpException e) {

e.printStackTrace();

flag = false;

msg[0] = "短信发送失败";

} catch (IOException e) {

e.printStackTrace();

flag = false;

msg[0] = "短信发送失败";

}

flag = WstkFqDx.dao.saveWstkFqDx(tkid,"您好,由于款项问题不能退款!",lxdh,dsrmc);

return flag;

}

});

if (tx==true) {

cl.setAttr("success", true);

cl.setAttr("msg", "撤销成功!");

}else {

cl.setAttr("success", false);

cl.setAttr("msg",msg[0]);

}

cl.renderJson();

}

评论区

JFinal

2019-08-30 16:24

你传入的 BaseController cl 参数,然后对其 cl.renderJson() 可能有问题,单步调试一下

JFinal

2019-08-30 16:25

如果你的 wstkCx(...) 方法是业务层,应该是返回一个值,然后 controller 中使用这个值,不要将 controller 传给业务层,这种用法是很不规范的

reborn797

2019-08-30 16:27

@JFinal 单步调试了,只要是return false 就直接报错,都执行不到后面的 cl.renderJson()

JFinal

2019-08-30 16:32

@reborn797 return false 报错,就要根据异常信息,先去解决这个错误

reborn797

2019-08-30 16:50

@JFinal wstkCx(...) 方法是业务层,我调整代码不传入controller,返回了值,但是还是报错,有点晕搞不明白。

reborn797

2019-08-30 17:20

@JFinal 搞不懂,直接在Db.tx 返回return false,没有写其它业务,还是报java.io.FileNotFoundException。但是return true 就可以。蒙了

JFinal

2019-08-30 17:58

@reborn797 你没在 controller 中调用 render 方法吧?

或者 render 方法的参数错了

还有一个可能是拦截器拦截了请求,将 render 导向了别的地方

马小酱

2019-09-04 09:41

一定是false的时候,没有render方法,单步调试很容易解决

vvwym

2019-09-04 17:45

Db.tx()调用的是DbPro.tx(Config config, int transactionLevel, IAtom atom)方法,里面是这样子写的:
boolean result = atom.run();
​ if (result)
​ return true;
​ throw new NestedTransactionHelpException("Notice the outer transaction that the nested transaction return false"); // important:can not return false

而NestedTransactionHelpException是一个RuntimeException,所以可以不用在tx方法用throws声明。这也是你后面的代码没有执行的原因。

处理方案:直接当成一般的编译异常处理,套一个try catch。

try{

​ DB.tx()

} catch(NestedTransactionHelpException e){

​ //这里写你的回滚事务的操作

}

希望能帮到楼主。