MyBatis 一个比较奇怪的参数绑定问题

2021-05-11 15:51:34 +08:00
 anzu

众所周知如果 Mapper 需要多个参数时,需要在每个参数前加上 @ Param 注解,如:

User findByUserIdAndName(@Param("userId") Integer userId, @Param("name") String name);

但是我不加也可以,于是我没加,正常运行。 现在重构项目,拆分成父子项目,结果全部报错:org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found. 网上都说是没加 @ Param 的原因,的确现在加上就不报错,但是为什么我之前没加也可以呢?

2084 次点击
所在节点    Java
6 条回复
qinxi
2021-05-11 15:56:23 +08:00
猜测: 之前编译保留了参数名, 拆分后编译参数名被抹去了
msaionyc
2021-05-11 16:29:57 +08:00
https://www.codenong.com/cs110818507/
感觉是这个原因,之前也有遇到过,但没有去深入了解
mitsuizzz
2021-05-11 16:32:40 +08:00
之前遇到过这个问题,网上查了很久,千奇百怪的。
最后发现是编译设定有关,本地 ide 默认给你加了个-parameters 参数导致编译保留了参数名不会报错。
详情参考:
https://www.concretepage.com/java/jdk-8/java-8-reflection-access-to-parameter-names-of-method-and-constructor-with-maven-gradle-and-eclipse-using-parameters-compiler-argument#compiler-argument
shoushi
2021-05-11 19:16:03 +08:00
是我之前遇到的问题了!多谢
yhpz
2021-05-11 23:57:32 +08:00
可以看下 MyBatis 源码中 ParamNameResolver 这个类:
for (Annotation annotation : paramAnnotations[paramIndex]) {
// 方法参数中,是否有 Param 注解
if (annotation instanceof Param) {
hasParamAnnotation = true;
// 获取参数名称
name = ((Param) annotation).value();
break;
}
}
if (name == null) {
// 未指定 @Param 注解,这判断是否使用实际的参数名称,参考 useActualParamName 属性的作用,IDEA 需要加 -parameters 参数
if (config.isUseActualParamName()) {
// 获取参数名
name = getActualParamName(method, paramIndex);
}
if (name == null) {
name = String.valueOf(map.size());
}
}
siweipancc
2021-05-12 12:13:16 +08:00
啊这……spring cache 一章有讲,还加红了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/776265

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX