当前使用版本(必填,否则不予处理)
3.4.3
该问题是如何引起的?(确定最新版也有问题再提!!!)
使用lambda查询时报错,JRE:16.0.1,Mybatisplus:3.4.3 ( JRE:16.0.1、Mybatisplus:3.4.0-3.4.2 或 JRE:11-15、Mybatisplus:3.4.3 无该问题)
重现步骤(如果有就写完整)
userMapper.selectOne(new LambdaQueryWrapper<User>()
.select(User::getId)
.eq(User::getId, userId)
.last(" limit 1"));
报错信息
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 @7a69b07
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:177)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:171)
at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:18)
at com.baomidou.mybatisplus.core.toolkit.SetAccessibleAction.run(SetAccessibleAction.java:9)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at com.baomidou.mybatisplus.core.toolkit.ReflectionKit.setAccessible(ReflectionKit.java:203)
at com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta.<clinit>(SerializedLambdaMeta.java:19)
at com.baomidou.mybatisplus.core.toolkit.LambdaUtils.extract(LambdaUtils.java:55)
at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.getColumnCache(AbstractLambdaWrapper.java:75)
at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnToString(AbstractLambdaWrapper.java:62)
at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.lambda$columnsToString$0(AbstractLambdaWrapper.java:53)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper.columnsToString(AbstractLambdaWrapper.java:53)
at com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.select(LambdaQueryWrapper.java:84)
Comment From: nancheung
该问题应当是由于JDK16引入的 JEP 396 特性造成。其实JDK9开始就已经引入了宽松强封装,但是JDK16进一步提高了JDK的安全性,默认情况下强封装JDK内部使其无法被非法访问(深度反射)。该特性已造成大量框架的现有代码无法正常运行。
3.4.3修改了识别Lambda的机制,见 #3517 。使用了反射,因而触发 JEP 396 的限制。
目前可以通过 JVM启动参数 --illegal-access=permit 以解除限制。见 JEP 396
或者使用 --add-opens java.base/java.lang.invoke=ALL-UNNAMED 。见 --add-opens
Comment From: qmdx
版本 3.4.3.2 已发布,请升级验证修复该问题,有任何问题 issue 该问题关闭!