You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat跨上下文+Spring Web MVC出现ClassCastException问题求助

Tomcat跨上下文配置中的类加载器冲突问题

环境信息

  • Java版本:21
  • Spring Web MVC版本:6.1.9
  • Hibernate版本:6.2.4.Final
  • Tomcat版本:apache-tomcat-10.1.24

问题现象

在探索Tomcat跨上下文配置时,在Spring Web MVC应用的@Controller的@GetMapping方法中访问另一个应用的上下文,触发如下ClassCastException:

java.lang.ClassCastException: class org.springframework.http.server.DefaultRequestPath cannot be cast to class org.springframework.http.server.RequestPath (org.springframework.http.server.DefaultRequestPath is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @4816278d; org.springframework.http.server.RequestPath is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @287bdaf3)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
    jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
    jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
    com.nividous.cc.controller.PersonController.includeContent(PersonController.java:48)
    java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    java.base/java.lang.reflect.Method.invoke(Method.java:580)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)

访问上下文的代码实现

// 获取另一个Web应用的ServletContext
ServletContext otherContext = request.getServletContext().getContext("/slave");

if (otherContext != null) {
    String targetUrl = null;
    targetUrl = "/slave" + request.getPathInfo();
    // 获取目标资源的RequestDispatcher
    RequestDispatcher rd = otherContext.getRequestDispatcher(targetUrl);

    if (rd != null) {
        // 将目标资源的内容包含到当前响应中
        rd.include(request, response);
    }
}

问题排查更新

  1. 更新1:发现该问题与Spring跨上下文场景下的已知类冲突问题类似,虽相关帖子发布时间较早,但错误指向一致。
  2. 更新2:此问题并非Spring专属问题,本质是类加载器隔离导致的——两个应用使用不同的类加载器,Spring添加到请求中的属性无法被正确识别转换。
  3. 更新3:计划尝试针对跨上下文应用类加载器冲突的解决方案。

内容的提问来源于stack exchange,提问作者Sariq Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:31:00