使用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 导向了别的地方