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:发现该问题与Spring跨上下文场景下的已知类冲突问题类似,虽相关帖子发布时间较早,但错误指向一致。
- 更新2:此问题并非Spring专属问题,本质是类加载器隔离导致的——两个应用使用不同的类加载器,Spring添加到请求中的属性无法被正确识别转换。
- 更新3:计划尝试针对跨上下文应用类加载器冲突的解决方案。
内容的提问来源于stack exchange,提问作者Sariq Shaikh
相关产品推荐
相关产品推荐

