黑马点评InaccessibleObjectException报错(小坑)

黑马点评P51实现秒杀下单的时候其中有一步需要使用mp更新数据库

原代码

下面是老师视频中的代码 项目可以正常运行

       boolean success = seckillVoucherService.update()
                .setSql("stock = stock - 1")
                .eq("voucher_id", voucherId)
                .update();

 使用lambda的代码

刚好本人前2天才学的mp  便想着使用另外一种方式来更新数据库(上面的字段是写死的,想要通过反射来获取字段)

这是我写的代码

        boolean success = seckillVoucherService.lambdaUpdate()
                .set(SeckillVoucher::getStock, stock - 1)
                .eq(SeckillVoucher::getVoucherId, voucherId)
                .update();

然后运行程序的时候意外的发现代码在.set这行就报错了

报错信息

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 @41e36e46

解决方法

将项目mp原本的3.4.3版本替换为3.5.3

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>

替换完成后即可正常运行

具体问题产生原因(github上找的)

上链接

该问题应当是由于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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值