使用mybatis plus的lambda表达式报错的解决

//            remove(new QueryWrapper<Follow>()
//                    .eq("user_id", userId).eq("follow_user_id", followUserId));
            remove(new LambdaQueryWrapper<Follow>().eq(Follow::getUserId, userId)
            .eq(Follow::getFollowUserId, followUserId));
//         Integer count = query().eq("user_id", userId).eq("follow_user_id", followUserId).count();
        Integer count = lambdaQuery().eq(Follow::getUserId, userId).eq(Follow::getFollowUserId, followUserId).count();

两段代码都是,一用lambda表达式就报错

1.报错

mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '' and ew.nonEmptyOfWhere'. Cause: org.apache.ibatis.ognl.OgnlException: sqlSegment [java.lang.NoClassDefFoundError: Could not initialize class com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta]

Caused by: org.apache.ibatis.builder.BuilderException: Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '' and ew.nonEmptyOfWhere'. Cause: org.apache.ibatis.ognl.OgnlException: sqlSegment [java.lang.NoClassDefFoundError: Could not initialize class com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta]

Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.baomidou.mybatisplus.core.toolkit.support.SerializedLambdaMeta

Caused by: java.lang.ExceptionInInitializerError: Exception 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 @7ec7ffd3 [in thread "http-nio-8081-exec-6"]

2.原因

这个错误是由于Java 9及以上版本的模块化系统导致的。在Java 9中,Java语言引入了模块化系统,对Java平台和API进行了重新组织和划分,将Java代码划分为一系列模块,每个模块都有自己的命名空间和可见性。在模块化系统中,访问限制更加严格,如果要访问模块中的受保护的类、方法或字段,需要在模块声明中明确指定。
代码中使用了反射来访问一个私有的final字段,但是这个字段所在的模块没有向当前模块开放访问权限。具体来说,这个错误是由于SerializedLambda类中的一个私有final字段capturingClass引起的,这个字段表示捕获对象的类。在Java 9及以上版本中,SerializedLambda类被划分到了java.base模块中,而当前模块没有被授权访问java.base模块中的SerializedLambda类。

3.解决方法

写入 

 --add-opens java.base/java.lang.invoke=ALL-UNNAMED

这会临时开放java.lang.invoke模块给所有未命名模块(即非模块化的代码),允许反射访问。

后面遇到的另一个:

module java.base does not "opens java.lang" to unnamed module

这个错误是由于Java 9及以上版本的模块化系统引入的限制。在Java 9之前,Java类加载器可以加载任何类,但是Java 9引入了模块化系统,限制了类加载器的访问权限。在新的模块化系统中,类加载器无法访问未在模块声明中明确打开的包

--add-opens=java.base/java.lang=ALL-UNNAMED

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值