li7

2021-04-23 12:45

这是 undertow 的问题。是undertow对http请求字节的转换处理,在io.undertow.server.handlers.form.FormEncodedDataDefinition.doParse() 方法中,undertow对我们的参数直接进行了强制char型转换。具体见这里 https://issues.redhat.com/browse/UNDERTOW-1278?jql=text%20~%20%22urlencoding%22。把 jfinal-undertow 升级到 2.5 就可以解决了。

li7

2019-04-28 14:21

嗯嗯,确实这个改动确实很容易。只是我发现这个问题才知道是版本升级导致的。所以我就觉得这样的版本升级可以避免,就比如从 afterJFinalStart 改为 onStart,就完全不影响旧的代码的运行。
个人想法。就是在小版本升级版本的时候,能尽量保障旧代码的运行不受影响

li7

2019-04-28 13:24

public M findByPk(){
Table table = _getTable();
String[] pKeys = table.getPrimaryKey();

if( pKeys == null ){
log.debug(table.getName() + " 未找到主键字段");
pKeys = new String[0];
}
Object[] vals = new Object[pKeys.length];

for (int i=0; i vals[i] = get(pKeys[i]);
}

return findById(vals);
}

li7

2019-04-28 13:24

主要问题是我是这样用的

li7

2019-04-28 07:05

应该是这样的,3.5版里面,有两个 findById 方法,接受两种类型的参数

public M findById(Object idValue) {
return findByIdLoadColumns(new Object[]{idValue}, "*");
}

public M findById(Object... idValues) {
return findByIdLoadColumns(idValues, "*");
}

我的代码里面用了 findById(Object... idValues) 这个。
但是从 3.6 开始, findById(Object... idValues) 这个方法又正好被删除了。
由于 findById(Object idValue) 这个方法还在,所以编译不报错,没警告。
但是 findById 里面的行为已经变了,导致查不到数据,执行也不报错。
就是这样了。

li7

2019-04-27 10:13

不好意思,这几天忘了。我是用的IDEA,升级到3.6之后,没有错误提示,代码编译不报错,也没有警告。整个工程可以正常运行。就是在用 3.6 版的 findById 时,将我传入的 idValue 转成了 new Object[]{idValue} 导致一直查不到数据。所以我才说 3.5 到 3.6 的这个升级,改变了 findById 的行为,导致升级时必须要修改所有的 findById 相关的代码

li7

2019-04-23 09:02

@JFinal 调整后,对于这两个方法的用途我没有疑问。只是觉得这样调整后,版本升级会比较麻烦。不敢升,不知道会不会有其他类似的情况。这样的调整编译不报错,没警告,只有覆盖测试...