JFinal事务真的有bug,不吹不黑, JFinal也必须有final~

变量,如果不加  final, 事务里是 不可见的。

在做Spring事务 ,java多线程之类的代码里,Eclipse会提示 变量必须final修饰,jfinal里 不会提示。

同样的变量,如果直接普通查询代码,确认 有值。


private static final LoanRepayAdminService loanRepayAdminService = LoanRepayAdminService.me;


public void doLoanFull(Long lid) {

Db.tx(new IAtom() {


@Override

public boolean run() throws SQLException {

}}

评论区

JFinal

2018-10-20 20:46

final 关键字的提示与不提示这个是开发工具决定的,jfinal 肯定是无法干预的,这个是 java 语法层面的事情

杜福忠

2018-10-21 09:54

Java8引入一个effectively final的概念,当内部类访问外部类变量时,只要内部类不对外部变量重新赋值,那么外部类变量就是一个事实上的final变量,Java会隐含地将外部变量声明为final 。不用我们显式的添加final标识了,实际上它还是final类型的,是编译器自动帮我们加上了而已。如果你试图改变它的值,它还是会报错的(以上粘自csdn)。说明你以前用的是Java7 -

fansunion

2018-10-21 14:56

fansunion

2018-10-21 14:56

JFinal

2018-10-21 15:00

@杜福忠 这个回答比我的要好,赞

fansunion

2018-10-21 20:55

@杜福忠 请教下,同样的代码,本地没报错,线上报错了。
明明已经用FInal标记了

private final LoanAdminService loanAdminService = LoanAdminService.me;
Db.tx(new IAtom() {

@Override
public boolean run() throws SQLException {
loanAdminService.save(loanUpdate);
}

fansunion

2018-10-21 20:56

@JFinal 请教下,同样的代码,本地没报错,线上报错了。
明明已经用FInal标记了,loanAdminService空指针。

private final LoanAdminService loanAdminService = LoanAdminService.me;
Db.tx(new IAtom() {

@Override
public boolean run() throws SQLException {
loanAdminService.save(loanUpdate);
}

fansunion

2018-10-21 21:38

@JFinal 先用model save/update 解决了,用Service 线上环境有问题。

//生成loanRepay
LoanRepay loanRepay = buildLoanRepay(lid, loan, deadline);
loanRepay.save();

热门反馈

扫码入社