2018-05-29 21:48

这个需求早就满足了,使用里头的带 java.io.File 参数的方法就可了,例如:
PropKit.use(new File("/var/config_center/myapp.config.txt"));

使用 File 参数,就可以使用任意路径下的文件了

2018-05-29 21:46

升级到最新版本的 jfinal 3.4,这版本对 wetWebRootPath() 改进过

如果还是不行,可以先通过 PathKit.getRootClassPath() 得到路径,然后再通过个路径值做点转换

如果上面都不行,还有一招最狠的,通过 PathKit.setWebRootPath(...) 手动设置一下,这个设置的值可以放在外部配置文件中,然后通过 PropKit.get(...) 加载进来

2018-05-28 19:17

@潇洒太爷 想这门弄来着,界面弄过很难看

2018-05-28 17:43

@芦苇 配置一下即可:
arp.getEngine().setToClassPathSourceFactory();

注意,这个配置要放在 arp.addSqlTemplate(...) 之前,否则次序不对

2018-05-28 16:18

@haojay 这个处理起来比较麻烦,因为社区的 @提到我 newsfeed remind 等功能模块都与贴子关联,要同时改的关联数据比较多,一不小心就会出问题

2018-05-28 16:14

@坩埚 注意,你只需要在 response.setHeader("Content-Security-Policy","img-src 'self'"); 后面继续添加 response.setHeader(...) ,并不需要再创建新的 Handler

2018-05-28 16:14

@坩埚 缺啥 header 就添加啥 header,此外你要注意 setHeader 与 addHeader 的区别,如果你某一个 header 是一次性添加的,使用 setHeader 即可,否则使用 addHeader

2018-05-28 15:54

@fmpoffice 这就奇怪了 enjoy 的异常都会指出哪一行出的错,你用的哪个版本的 jfinal ?

2018-05-28 15:39

找一下 jfinalUIB 的作者,或者加入 jfinalUIB 的群

2018-05-28 15:35

@ben0133 在 java 8 下使用 Db.tx 可以使用 lambda 表达式,使用起来代码会更简洁:
public void test() {
final Ret ret = Ret.create();
Db.tx(() -> {
Db.update("update ta set f1 = ?", 123);
Db.update("update tb set f2 = ?", 456);
ret.set("key", 123); // 使用 ret 带回点数据
ret.set("msg", "xxxx"); // 使用 ret 带回多个数据
return true; // 返回 true 提交事务
});
}

上面的例子还演示了通过一个 final Ret 局部变量从 lambda 表达式中带回返回值的使用方法,返回多个值的需求也可以很方便地解决

2018-05-28 15:29

@rirai jfinal 3.4 已发布,所以 @玛雅牛 的shiro 插件可以直接使用了,而不必从 3.3 降级到 3.2 了

2018-05-28 15:26

@lyh061619 这个是 oracle 驱动的 bug,不太好调整,因为getPrimaryKeys() 方法返回来的是不是主键,这个在 jfinal 这头是无法判断的

2018-05-28 15:25

好多事情,还没顾上,用下面这个方法先顶一顶:
在 baidu 的搜索框里头输入:
site:jfinal.com 关键字

2018-05-28 14:23

@syso 具体的代码分享出来啊,修改这个帖子,追加内容就好

2018-05-28 11:00

@ben0133 对,我个人是建议使用 Db.use(...).tx(...) 做事务,控制起来比较方便

现在很多项目是互联网项目,需要开启事务的地方并不多,大部分请求不需要开启事务,所以使用 Db.tx(...) 是很合适的

如果是一个内部的业务系统,并且大部分业务需要开启事务的话,使用拦截器开启事务,并配合一个全局拦截器 try catch 事务抛出的异常,并响应合适的 json/view 是最方便的