2017-09-28 23:01

jfinal weixin 的功能是非常完善和可靠的,感谢你的分享

2017-09-28 22:58

@杜福忠 感谢回复了这么多的问题,社区照这样发展下去,我肯定要被累得不轻

2017-09-28 22:57

这个问题在 jfinal 中不会出现,因为 jfinal 的热加载很好的处理过 class loader 的问题,而按理说 spring boot 的 devtools 应该也会处理好这个问题,否则其它很多非 jfinal 的模块照样会碰到类似的某一处代码被多次执行的问题

2017-09-28 22:56

这个是 spring Boot 的 devtools 的在热加载时,并没有切换掉 ClassLoader,从而造成热加载前的 Engine 对象中的配置还有那里,热加载以后再次添加,自然会报一个 template function already exists

建议的解决办法:
1:自己建一个 static boolean isEngineInited = false; 变量
2:在系统启动后,让这个变量变为 true
3:变为 true 以后,就不再对 enigne 进行配置

具体操作时,可以是创建一个 configEngine() 方法来对 engine 进行配置,在这个方法中添加对 isEngineInited 变量的控制即可

2017-09-28 22:52

如果 render(view) 中的 view 以 "/" 打头,就会直接跳到 webroot 下面去,从而忽略 baseViewPath,这个在 jfinal 手册中有说明

2017-09-28 22:49

@WJME 这个用法也挺好的

2017-09-28 22:48

生成器会生成 setter 方法,而 settter 方法内部会有这个对应关系:
publci void setUserType(userType) {
set("user_type", userType);
}

这个关系就在这一行 set 代码处,这些代码都是自动生成的,不需要人工干预,下载首页的 jfinal demo,里面有生成器

2017-09-28 22:05

jfinal weixin 提供了专门的扩展接口,看一下 wiki 即可: https://gitee.com/jfinal/jfinal-weixin/wikis

2017-09-28 22:04

这个 jfinal 根本没有干预过,也没法干预到,是 mysql 自己的行为

2017-09-28 22:03

@windpopul jfinal 从来就没有过 AutoBindRoutes 这个东东

2017-09-28 21:59

Tx 拦截器以及 Db.tx(...) 方法默认是支持主数据源上的事务,如果要支持“非主数据源”上的事务,需要 TxConfig 注解配合 Tx 拦截器,或者 Db.use(...).tx(...) 来实现

以上也只是让各数据源处在多个事务中,而不能是一个事务中,让多数据源处于同一个事务中,这属于分布式事务的范畴,jfinal 目前暂不支持

跨数据源的分布式事务,实现起来代码比较难看,对性能也会有一定影响,所以 jfinal 暂时不支持这个特性

跨数据源的事务,建议将业务拆分成多个步骤来做,而每个步骤处于单个事务中

2017-09-28 21:56

@djs19960601 这就很清楚了,感谢你的分享,我也收藏了这个贴子,以后用得着

2017-09-28 21:55

@fengting jfinal 几乎所有的模块都预留了扩展机制,例如 Handler、Render、Plugin、TokenCache、CaptchaCache 等等,稍微看看代码就知道如何扩展了

2017-09-28 21:53

写得很详细了,一点也不像小白,感谢你的分享

2017-09-27 21:36

确实会碰到这个初始化次序的事情,最简单的办法是将 Redis.use(...) 放在 put 方法内部

还有一个办法是通过一个 static Constants constants 属性在 configConstant(Constants me) 中通过下面的代码将 me 存起来:
constants = me;

然后创建一个方法来操作:
public void afterJFinalStart() {
constants.setCaptchaCache(...);
}

afterJFinalStart() 的说明见 jfinal 手册