2020-08-08 00:09

@糊搞 升级的这个项目规模并不小,2011 年启动的创业项目,迭代到 2013 年才停止

如果只是 N 年前写的 "小白的第一个JFinal程序" ,那没有必要拿来分享

2020-08-08 00:08

@SuperEric 跟着升级文档走会更全面, jfinal undertow 是完美支持 jfinal 所有版本的,本质上也支持所有其它基于 servlet 开发的 java 项目

2020-08-08 00:07

初始 jfinal @杜福忠 同学是菜鸟一枚,跟进到 3.0 就经成长为高手

关注 jfinal 动向,研究设计思想,理解源码,进步就是这么神速

时间投资到 jfinal 是值得的

2020-08-07 16:46

框架未做这个处理,建议跟踪一下代码

有可能是你将 Strnig 转 json 时,第三方 json 框架做的这个处理,例如 fastjson

2020-08-07 16:24

你的 sql 中的 select 中只有一个字段:registrationid, 所以返回值会被封装成 List《Object》,也就是说 List 中的元素直接就是数据值

如果 select 中的字段超过 1 , 则会封装成 List《Object[]》,也就是说 List 内部的无素是 Object 数组

你得到的返回值 list.size() 为 1,证明是确实查到了一条数据,只不过这条数据的值是 null 而已, 要注意数据库也是可以存在 null 值的

检查数据库中的 registrationid 有没有值为 null 的记录

2020-08-07 15:36

你创造了 jfinal 跨版本升级记录: 跨 23 个版本

这 23 个版本中, 多数版本改进升级的功能与特性都在 40 至 50 个,能跨越这么多个版本升级的原因是我在 jfinal 俱乐部视频中反复强调的:极简设计

jfinal 在 9 年前就坚持的极简设计,其 Handler、Interceptor、Controller、Render、Plugin 内核结构 9 年不变,轻松应对这 9 年来各种千奇百怪的需求

你本次跨 23 个版本升级 jfinal,其中第一、第三条本质是改类名:ClearInteceptor 改为 Clear
第二条也是改类名:ActionInvocation 改为 Invocation
第六条是改默认配置

绝大部分改动是改名类或方法名,这种改动 eclipse 会有错误提示,升级起来很安全,不会漏掉

真正切实有兼容性影响的是第 7 条中 dao.findById 改为findByIdLoadColumns(id,"字段名")

第 8 条不叫改动,是将原来的 jetty-server 换成使用 jfinal-undertow

点赞加收藏

2020-08-07 15:21

@牛哥哥大 这个问题在文档中有详细说明,例如:
paginate(1, 5, "select (... where x = ?)", "from article where id=?", 8, 10);

上面 paginate 的第一部分有一个嵌套,其中有问号占位,在生成分页查询时参数对不上,具体细节见文档:
https://jfinal.com/doc/5-6

这部分文档例出了分页可能碰到的问题,及其原因

2020-08-07 14:34

注意外层套 select 的时候,不要改变内部 sql 的结构,要保障是下面这样的:
select * from (原来的 sql 原封不动在此 ) as temp

如果你在外层再添加 where , 那就是另一类 sql 了,性能会有所不同

2020-08-07 14:32

@牛哥哥大 大部分情况下,套了外层 select 后并不会变慢,因为套一层并不会增加数据的匹配量级

估计你碰到的是别的问题,你可以试一试在千万级的数量的情况下对比一下套一层 select 与否的性能

2020-08-07 14:10

文档中有明确说明,要配置方言:
arp.setDialect(new PostgreSqlDialect());

2020-08-06 17:36

Validator 中的 validateXxx 系的方法不支持 getRawData(),但是你可以像下面这样使用:

protected void validate(Controller c) {
String json = c.getRawData();
Map map = FastJson.getJson().parse(json, Map.class);

if (map.get("nickName") == null) {
addError("msg", "昵称不能为空");
}
....
}

也就是说,你可以在 validate 方法中通过 if 判断 + addError 来实现定制功能

2020-08-06 10:08

@贺月月 基本照抄现有的 CaptcahRender()即可

2020-08-05 15:40

@lang重名 其实我很希望 jfinal 代码能去除这类功能性代码,但作为一个可用于千变万化场景下的通用 web 框架,有些较强烈的需求不得不满足

2020-08-05 15:09

有不少同学提出需求,需要掌控 configPlugin 被回调的次序,你通过 me.setConfigPluginOrder(int) 方法就可以调整次序了

该方法在代码中的注释如下:
/**
* 配置 configPlugin(Plugins me) 在 JFinalConfig 中被调用的次序.
*
* 取值 1、2、3、4、5 分别表示在 configConstant(..)、configInterceptor(..)、
* configRoute(..)、configEngine(..)、configHandler(...)
* 之后被调用
*
* 默认值为 3,那么 configPlugin(..) 将在 configRoute(...) 调用之后被调用
* @param 取值只能是 1、2、3、4、5
*/

2020-08-05 15:07

@_imlzw_ 估计是你的项目在哪里动了 ClassLoader 才出现的这个问题

正常流程使用 jfinal 从来不会出这个问题