MP版本问题
问题出现场景:
写登录逻辑的时候,验证完验证码去查询手机号是否存在,因此就要根据手机号查询用户
因为熟悉方法引用因此我的查询是这么写的
User user = lambdaQuery().eq(User::getPhone, loginForm.getPhone()).one(); // error
就在我美滋滋的准备运行的时候,不出意外的话是出意外了
然后我就去看人家怎么写的
User user = query().eq("phone",loginForm.getPhone()).one(); // success
这就很奇怪,根据之前所学这明明就没有区别
解决思路:
首先我想是不是学艺不精 写的不对于是就去查了官网
官网写法:
咱就是说 不说完全一样 也算真假美猴王的程度吧。
那就证明不是自己写错了
那咋办捏?
只能求助AI了
由于最开始错误LOG没定位精准 给的结果都是没有参考性的
因此只说一下最终结果
最终结果:
错误信息如下:
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not "opens java.lang.invoke" to unnamed module @5e82df6a
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[na:na]
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[na:na]
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) ~[na:na]
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172) ~[na:na]
at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:18) ~[mybatis-plus-core-3.4.3.jar:3.4.3]
at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:9) ~[mybatis-plus-core-3.4.3.jar:3.4.3]
at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) ~[na:na]
at com.baomidou.mybatisplus.core.toolkit.ReflectionKit.setAccessible(ReflectionKit.java:203) ~[mybatis-plus-core-3.4.3.jar:3.4.3]
at com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta.<clinit>(SerializedLambdaMeta.java:19) ~[mybatis-plus-core-3.4.3.jar:3.4.3]
... 132 common frames omitted
GPT解答:
这个错误是因为Java 9及以上版本开始引入了模块化系统,而MyBatis Plus的反射操作需要使用Java的内部类SerializedLambda。由于SerializedLambda的实现被定义成内部模块,而mybatis-plus-core-3.4.3.jar在模块化环境下无法直接访问所需的模块,因此会出现上述错误。
解决该问题可以使用–add-opens命令显式指定将java.lang.invoke模块的内容开放给mybatis-plus-core-3.4.3.jar所在的模块,具体操作方法如下:
1.在Java命令行中增加–add-opens java.base/java.lang.invoke=ALL-UNNAMED参数,如下所示:
java --add-opens java.base/java.lang.invoke=ALL-UNNAMED -jar your-application.jar
2.在运行时使用Java System Property指定该参数,如下所示:
java -Djdk.internal.lambda.dumpProxyClasses=./ -Djvmci.Compiler=graal -Dspring.profiles.active=prod -Duser.timezone=Asia/Shanghai -Dfile.encoding=UTF-8 -jar my-application.jar --add-opens java.base/java.lang.invoke=ALL-UNNAMED
希望对你有所帮助!
不过我没有尝试这个办法
我的解决方案是把我的JDK17换成了JDK8
补充:
后续又问了chatgpt几句 好像MP 3.4.4以上就解决了这个问题
刚好我用的是 3.4.3 不过不知道版本升级是否好用 没有去尝试
也算一个潜在的思路吧。