MP遇到的一个问题

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 不过不知道版本升级是否好用 没有去尝试
也算一个潜在的思路吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值