Jfinal 中我想添加针对实体类MODLE的拦截器,应该怎么添加

具体需求是这样,我有很多实体类,都有 update_time 和 add_time 两个字段,我想在保存或更新数据的时候自动给这两个字段填充上当前时间。Jfinal里应该怎么实现,mybatis里有数据实体拦截器https://www.jianshu.com/p/99f585ac855e

评论区

Max_Qiu

2020-06-08 16:56

add_time可以用MySQL的字段默认值完成
update_time可以用MySQL的自动更新完成

海哥

2020-06-08 17:01

如果是使用 Jboot 的话:

可以通过 JbootModelConfig.getConfig().setFilterClass() 来实现。
其中 filterClass 需要实现 JbootModelFilter 接口,来自定义为 每个 save update 的 model 设置值、删除值 或者 修改值等。

从而可以达到楼主的要求,亦或者是对 xss 攻击进行过滤等功能。

JFinal

2020-06-08 17:07

按下面的步骤:
1:将 jfinal 中的 base_model_template.jf 文件复制出来,放在 src/main/resource 目录下面,该文件可以在 jfinal 源码中获取到:
https://gitee.com/jfinal/jfinal/blob/master/src/main/java/com/jfinal/plugin/activerecord/generator/base_model_template.jf

2:修改 base_model_template.jf,在最后一个 #end 之前添加如下代码:
public boolean save() {
set("add_time", new Date());
return super.save();
}

public boolean update() {
set("update_time", new Date());
return super.update();
}

3:配置生成器:
Generator gen = new ....;
gen.setBaseModelTemplate("base_model_template.jf");
gen.generate();

JFinal

2020-06-08 17:09

除了上面的代码,还可以用下面的办法:
1:public class MyModel extends Model 添加与上面回复中一样的代码

2:修改 base_model_template.jf,将其中的 extends Model 改为 extends MyModel
也就是说,将 base model 原本继承 Model ,改为继承自己扩展的 MyModel

3:最后配置: gen.setBaseModelTemplate("base_model_template.jf");

JFinal

2020-06-08 17:10

如果只有少数的 Model 需要这个功能,也可以在最终的 Model 中手动添加上面的 save()、update() 方法

此外,如果要扩展 Db.save、Db.update 方法,可以扩展 DbPro, 然后配置:
arp.setDbProFactory(...)

这样就可以接管原有的 Db.save、Db.update 方法

HingLo

2020-06-08 17:25

可以通过实现Model中的filter方法来实现。

qianlong

2020-06-08 17:35

@JFinal 谢谢波总

qianlong

2020-06-08 17:36

@HingLo 好的,我试试,谢谢

qianlong

2020-06-08 17:37

@Max_Qiu 这个方法有些依赖数据库,所以我想试试其他方法

qianlong

2020-06-08 17:37

@海哥 谢谢海哥

JFinal

2020-06-08 18:01

@qianlong 其实有很多办法,稍微了解一下 jfinal 源码就能找到很多办法

参考 jfinal club 中的 Share.java 这个类,里头用到了 filter 方法,也是可以的

热门反馈

扫码入社