JFinal 3.3 代码生成小问题

升级到JFinal 3.3后发现BaseModel和Model的代码生成已经换成模板实现了(詹总推出模板的这一天就注定了这个改动的到来……),由于我对Model和BaseModel进行了进一步的封装,所以3.2的时候我就对此进行过改动以满足个人需求。

在适配3.3的时候,模板修改方便没有任何问题,而且看起来比以前更加优雅,但当我重复生成某张表的Model的时候抛出如下异常:

微信截图_20171124094541.png

然后我看了源代码,发现JFinal每次生成代码的时候都会创建一遍对应的模板。

TIM截图20171124095025.png

为此我咨询了詹总,他的回复是代码生成应该是一次性操作,生成之后就退出JVM了,所以应该不存在这个问题。但是我把代码生成嵌入到了WEB项目,可以指定表、指定包进行生成,所以存在多次调用的情况,也就触发了这个异常。

解决方法也很简单,覆盖Generator的generate()方法,super.generate();后添加以下代码移除模板即可。

TIM截图20171124095633.png

注:我这边没有生成MappingKit的需求,如果需要重复调用生成MappingKit,也应该要添加Engine.remove("forMappingKit");

打完收工~


评论区

JFinal

2017-11-24 11:46

这确实是一个很好的办法,感谢你的分享

我还想到一个更好的解决办法, 在调用完 generator.generate() 这个方法以后,再调用三次 remove 就可以了:
Engine.remove("forBaseModel");
Engine.remove("forModel");
Engine.remove("forMappingKit");

这种方式可以不用对 BaseModelGenerator 这些类扩展,你试试

Lintel

2017-11-24 12:23

@JFinal 我扩展主要是为了满足其它需求,所以就顺便放到扩展类里了~其实我觉得还是应该在JFinal层面多加一行remove。。

JFinal

2017-11-24 16:46

@Lintel jfinal 下一版本肯定不再需要用户做任何 remove 动作,会在根本上解决

rhz-a

2017-11-29 18:26

波总这个方法好!我用此法生成的模型替换 jfinal_demo_for_maven 中的 MySql 生成的模型工作很好。

但是,H2 数据库在忽略大小写时生成的模型方法 getTITLE() 、setTITLE() 等方法,与 demo 不匹配,要用的话改动较大。假如用 H2 做项目,以后切换数据库改动太大了。不知有没有简单的解决方案?

rhz-a

2017-11-29 18:36

想了下,使用 H2,以后切换数据库,如果仍用忽略大小写选项,可能也没啥问题。
但既然是忽略大小写,只在数据库侧忽略大小写,程序(员)侧并未忽略大小写,必须用形如 getTITLE() 或 get("TITLE") 的大写,仍然觉得有点怪怪的。

JFinal

2017-11-29 20:06

@rhz-a H2 这种情况可以通过定制生成器的 MetaBuilder 来实现很容易

danish001

2017-12-13 22:31

@JFinal 波总, jfinal3.3是否支持JSON转javabean(即自动生成带get set方法的model),比如:String paraJson = HttpKit.readData(getRequest());
SaleClientele vo = JSON.parseObject(paraJson, SaleClientele.class); 目前3.2不支持,json转生成baseMode,即javabean model,值为空;如果转为换为自己定义的javabean,肯定没有问题。json转换成自动生成javabean model,目前没有找到好的解决方法,请问波总有好的解决办法吗?请赐教,谢谢

Lintel

2017-12-14 12:58

@danish001 这个3.0就有了吧,Controller.getBean

热门分享

扫码入社