Spring框架forward符号疑似Bug:从Spring3升级至Spring6的XML配置应用问题
Spring框架forward符号疑似Bug:从Spring3升级至Spring6的XML配置应用问题
我最近在将一个基于XML配置的Spring应用从Spring 3升级到Spring 6时,发现Spring框架里的forward:符号似乎存在一个Bug。为了方便复现和排查这个问题,我专门搭建了一个测试项目,下面是完整的项目配置和代码细节:
项目构建配置(build.gradle)
plugins { id 'java' id 'war' // Add war plugin for web application } group = 'com.avenuinsights' version = '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { def springVersion = '6.2.7' implementation "org.springframework:spring-webmvc:${springVersion}" implementation "org.springframework:spring-context:${springVersion}" implementation group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '6.1.0' implementation group: 'jakarta.servlet.jsp', name: 'jakarta.servlet.jsp-api', version: '3.1.1' implementation group: 'jakarta.servlet.jsp.jstl', name: 'jakarta.servlet.jsp.jstl-api', version: '3.0.2' implementation group: 'org.glassfish.web', name: 'jakarta.servlet.jsp.jstl', version: '3.0.1' testImplementation platform('org.junit:junit-bom:5.10.0') testImplementation 'org.junit.jupiter:junit-jupiter' } test { useJUnitPlatform() }
Web应用部署描述符(web.xml)
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- Configure the Spring DispatcherServlet --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- Map all requests to the DispatcherServlet --> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
Spring MVC配置文件(spring-mvc.xml)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- Enable Spring MVC features --> <mvc:annotation-driven /> <!-- Configure controllers as beans --> <bean id="firstController" class="org.example.forwardxml.controller.FirstController" /> <bean id="secondController" class="org.example.forwardxml.controller.SecondController" /> <bean id="thirdController" class="org.example.forwardxml.controller.ThirdController" /> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /first=firstController /second=secondController /third=thirdController </value> </property> </bean> <!-- Define the View Resolver --> <bean class="org.example.forwardxml.resolver.TranslatingViewResolver"/> <bean id="urlViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/> </bean> </beans>
Controller实现代码
FirstController.java
public class FirstController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("FirstController: Processing request..."); // Forward to the second controller return new ModelAndView("second.one"); } }
SecondController.java
public class SecondController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("SecondController: Processing request..."); // Forward to the third controller return new ModelAndView("third.one"); } }
ThirdController.java
public class ThirdController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("ThirdController: Processing request..."); // Create a model and view to display "Hello, World!" ModelAndView modelAndView = new ModelAndView(); // 原内容此处截断,推测是设置视图名称,例如:modelAndView.setViewName("forward:/hello.jsp"); } }
在Spring 3版本中,这套转发逻辑可以正常工作,请求能依次经过FirstController → SecondController → ThirdController,最终正确渲染视图。但升级到Spring 6之后,转发行为出现异常,无法按预期完成跳转流程。
内容来源于stack exchange
相关产品推荐
相关产品推荐

