baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.3k stars 4.3k forks source link

Exception:org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.select([Lcom/baomidou/mybatisplus/core/toolkit/support/SFunction;)Lcom/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper; #5803

Closed githubwyj closed 9 months ago

githubwyj commented 9 months ago

当前使用版本(必填,否则不予处理)

mybatis-plus: 3.5.4.1 mybatis: 3.5.14

该问题是如何引起的?(确定最新版也有问题再提!!!)

之前的版本 mybatis-plus: 3.5.3.2
mybatis:3.5.9 没有出现这个问题

重现步骤(如果有就写完整)

就是在使用查询的时候自定义查询字段

lambdaQueryWrapper.select(XX::XX);

报错信息

Exception:org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.select([Lcom/baomidou/mybatisplus/core/toolkit/support/SFunction;)Lcom/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper; at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1087) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) 中间省略 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1790) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:750) Caused by: java.lang.NoSuchMethodError: com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper.select([Lcom/baomidou/mybatisplus/core/toolkit/support/SFunction;)Lcom/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper;

nieqiurong commented 9 months ago

检查是否依赖冲突或者提供复现工程

deeplyloving commented 2 months ago

问题原因为 编译的时候用的低版本。 运行时使用的高版本。 比如 同时存在 3.5.3.1 和 3.5.3.2 两个版本 A依赖3.5.3.1编译 B依赖A模块 又指定了 版本 3.5.3.2 A模块使用 3.5.3.1编译, 但运行B模块的时候 实际 上使用的是 3.5.3.2 导致找不到对应的方法。 例如: 3.5.3.1 Query 接口中 定义为

Children select(R... columns);

LambdaQueryWrapper 实现为:

@SafeVarargs
@Override
public final LambdaQueryWrapper<T> select(SFunction<T, ?>... columns) {
    return select(Arrays.asList(columns));
}

//编译后字节码
 invokevirtual #58 <com/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper.select : ([Lcom/baomidou/mybatisplus/core/toolkit/support/SFunction;)Lcom/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper;>

在 3.5.3.2中 Query 接口直接提供默认方法

default Children select(R... columns) {
    return select(true, columns);
}

//编译后字符码
invokevirtual #58 <com/baomidou/mybatisplus/core/conditions/query/LambdaQueryWrapper.select : ([Ljava/lang/Object;)Ljava/lang/Object;>

观察 两个字节码 就能很明确知道为何 报 NoSuchMethodError 异常。

3.5.3.1 编译后需要调用select(SFunction<T, ?>... columns) 方法 而在 3.5.3.2中 并不存在。

Update 中的 setSql 亦存在相同的问题。均为 低版本 编译 。高版本 运行 导致的不兼容问题