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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:53:08