问题排查 java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.forceMkdirParent

问题背景

代码:

@Component
public class CheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding(StandardCharsets.UTF_8.name());
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        
        ...
        FilterChain.doFilter(httpRequest, response) 
        
        ...
    }
}

上传文件时,在 doFilter 报错,异常堆栈:

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.forceMkdirParent(Ljava/io/File;)V] with root cause
java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.forceMkdirParent(Ljava/io/File;)V
    at org.apache.commons.io.output.DeferredFileOutputStream.thresholdReached(DeferredFileOutputStream.java:222)
    at org.apache.commons.io.output.ThresholdingOutputStream.checkThreshold(ThresholdingOutputStream.java:223)
    at org.apache.commons.io.output.ThresholdingOutputStream.write(ThresholdingOutputStream.java:127)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:107)
    at org.apache.commons.fileupload.util.Streams.copy(Streams.java:70)
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:347)
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:115)
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:158)
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:142)
    at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1128)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:960)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

排查流程

google 搜不到任何相关信息,说明 bug 具有特殊性,可以说是很白痴的那种

先单步到抛异常之前,发现到某一步就直接跳到按语法规则不可能跳到的地方

找到 forceMkdirParent 方法所在的包,发现无法断点。即用 idea 再行左标红点时会自动置灰

说明看到的包不是实际运行的包,NoSuchMethodError 就是说依赖包中的代码不存在这个方法

尝试刷新 idea 缓存重启,没有改善

用 gradle dependencies 看了下依赖树,和别人的是一样的,但是其他人文件可以正常上传。说明不是依赖的问题

用 gradle 命令将项目打包,然后解压并运行输出的包,现象跟用 idea 运行一样,说明不是 idea 的 bug

不是代码的问题,不是 idea 的问题,也不是依赖的问题,那么就只能是 gradle 配置的问题了

将 gradle 重装以后,bug 解决

你可能感兴趣的:(问题排查 java.lang.NoSuchMethodError: org.apache.commons.io.FileUtils.forceMkdirParent)