Close

Spring MVC - RedirectView With Automatic Model attribute to Query Parameter Mapping

[Last Updated: Aug 4, 2026]

The last tutorial shows how to use RedirectView to perform 302 redirect.
In this tutorial we will see how RedirectView supports automatic mapping of Model attributes to redirected query params.

Note that this feature was deprecated in Spring MVC 6 and completely removed in Spring MVC 7.


Example

The Controller

package com.logicbig.example;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.view.RedirectView;
import java.util.Map;

@Controller
public class MyController {

    @RequestMapping("test")
    public RedirectView handleTestRequest(Model model) {
        model.addAttribute("myModelAttribute",
                           "attributeVal");
        RedirectView rv = new RedirectView();
        rv.setUrl("/test2");
        return rv;
    }

    @ResponseBody
    @RequestMapping("test2")
    public String handleRequest(@RequestParam Map<String, String> params) {
        return "response body from test2, params: "+params;
    }
}

In above example handleTestRequest returns instance of RedirectView. The attributes added to Model in this method are automatically used as query string in the resultant new redirected URL location i.e. test2?myModelAttribute=attributeVal


RequestMappingHandlerAdapter#ignoreDefaultModelOnRedirect flag

The RequestMappingHandlerAdapter provides a flag called "ignoreDefaultModelOnRedirect", which can be used to disable (by setting it to true) default model attributes to redirected params mapping.

package com.logicbig.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;

@EnableWebMvc
@Configuration
@ComponentScan
public class MyWebConfig {

    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter adapter =
                new RequestMappingHandlerAdapter();
        adapter.setIgnoreDefaultModelOnRedirect(false);
        return adapter;
    }
}
Spring MVC 3.1 :
The RequestMappingHandlerAdapter along with ignoreDefaultModelOnRedirect flag was introduced in Spring MVC 3.1.
The default value was false so the auto mapping of model attributes to directed query param was enabled by default. We could disabled that behavior by setting it to true.

Spring MVC 6:
The default value of ignoreDefaultModelOnRedirect was changed to true (i.e., the model is ignored by default).
The setter method (setIgnoreDefaultModelOnRedirect) was marked deprecated, signaling that the flag would be removed in a future release.

Spring 7 and later:
The flag has been completely removed.
There is no longer any global switch to control whether model attributes become query parameters. That means starting Spring MVC 7, there's no way to to map Model attributes to directed query parameters automatically.

The only supported way to pass data as query parameters on a redirect is to explicitly use RedirectAttributes.addAttribute() in your controller method ( next tutorial).

Key point:
The framework now forces you to be explicit and intentional about which attributes go into the URL, rather than relying on an implicit global rule.
No functionality is lost – you just have to declare your intent directly.

Running the Example

To try examples, run embedded Jetty (configured in pom.xml of example project below):

mvn jetty:run

Enter the URL in your browser

http://localhost:8080/test

Using curl

$ curl -s -iL "http://localhost:8080/test"
HTTP/1.1 302 Found
Date: Sat, 01 Aug 2026 13:31:12 GMT
Content-Language: en-US
Location: http://localhost:8080/test2?myModelAttribute=attributeVal
Content-Length: 0
Server: Jetty(9.4.53.v20231009)

HTTP/1.1 200 OK
Date: Sat, 01 Aug 2026 13:31:12 GMT
Content-Type: text/plain;charset=iso-8859-1
Content-Length: 65
Server: Jetty(9.4.53.v20231009)

response body from test2, params: {myModelAttribute=attributeVal}

The integration Test

package com.logicbig.example;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.DefaultMockMvcBuilder;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@ExtendWith(SpringExtension.class)
@WebAppConfiguration
@ContextConfiguration(classes = MyWebConfig.class)
public class ControllerTest {

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @BeforeEach
    public void setup() {
        DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.wac);
        this.mockMvc = builder.build();
    }

    @Test
    public void testController() throws Exception {

        String redirectedUrl =
                this.mockMvc.perform(get("/test"))
                            .andExpect(status().isFound())
                            .andReturn().getResponse()
                            .getRedirectedUrl();
        assertEquals("/test2?myModelAttribute=attributeVal",
                     redirectedUrl);

        this.mockMvc.perform(get(redirectedUrl))
                    .andExpect(status().isOk())
                    .andExpect(content().string(
                            "response body from test2, "
                                    + "params: {myModelAttribute=attributeVal}"));

    }
}
mvn clean test -Dtest="ControllerTest"

Output

$ mvn clean test -Dtest="ControllerTest"
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.logicbig.example:spring-redirect-view-with-auto-query-mapping:war:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-war-plugin is missing. @ line 43, column 21
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] --< com.logicbig.example:spring-redirect-view-with-auto-query-mapping >--
[INFO] Building spring-redirect-view-with-auto-query-mapping 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- clean:3.2.0:clean (default-clean) @ spring-redirect-view-with-auto-query-mapping ---
[INFO] Deleting D:\example-projects\spring-mvc\spring-redirect-view-with-auto-query-mapping\target
[INFO]
[INFO] --- resources:3.3.1:resources (default-resources) @ spring-redirect-view-with-auto-query-mapping ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\example-projects\spring-mvc\spring-redirect-view-with-auto-query-mapping\src\main\resources
[INFO]
[INFO] --- compiler:3.3:compile (default-compile) @ spring-redirect-view-with-auto-query-mapping ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to D:\example-projects\spring-mvc\spring-redirect-view-with-auto-query-mapping\target\classes
[INFO]
[INFO] --- resources:3.3.1:testResources (default-testResources) @ spring-redirect-view-with-auto-query-mapping ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\example-projects\spring-mvc\spring-redirect-view-with-auto-query-mapping\src\test\resources
[INFO]
[INFO] --- compiler:3.3:testCompile (default-testCompile) @ spring-redirect-view-with-auto-query-mapping ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\example-projects\spring-mvc\spring-redirect-view-with-auto-query-mapping\target\test-classes
[INFO]
[INFO] --- surefire:3.2.5:test (default-test) @ spring-redirect-view-with-auto-query-mapping ---
[INFO] Using auto detected provider org.apache.maven.surefire.junit4.JUnit4Provider
[WARNING] file.encoding cannot be set as system property, use <argLine>-Dfile.encoding=...</argLine> instead
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.logicbig.example.ControllerTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.041 s -- in com.logicbig.example.ControllerTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.184 s
[INFO] Finished at: 2026-08-01T21:31:56+08:00
[INFO] ------------------------------------------------------------------------



Example Project

Dependencies and Technologies Used:

  • spring-webmvc 6.0.0 (Spring Web MVC)
     Version Compatibility: 3.2.9.RELEASE - 6.2.19Version List
    ×

    Version compatibilities of spring-webmvc with this example:

      javax.servlet-api:3.x
    • 3.2.9.RELEASE
    • 3.2.10.RELEASE
    • 3.2.11.RELEASE
    • 3.2.12.RELEASE
    • 3.2.13.RELEASE
    • 3.2.14.RELEASE
    • 3.2.15.RELEASE
    • 3.2.16.RELEASE
    • 3.2.17.RELEASE
    • 3.2.18.RELEASE
    • 4.0.0.RELEASE
    • 4.0.1.RELEASE
    • 4.0.2.RELEASE
    • 4.0.3.RELEASE
    • 4.0.4.RELEASE
    • 4.0.5.RELEASE
    • 4.0.6.RELEASE
    • 4.0.7.RELEASE
    • 4.0.8.RELEASE
    • 4.0.9.RELEASE
    • 4.1.0.RELEASE
    • 4.1.1.RELEASE
    • 4.1.2.RELEASE
    • 4.1.3.RELEASE
    • 4.1.4.RELEASE
    • 4.1.5.RELEASE
    • 4.1.6.RELEASE
    • 4.1.7.RELEASE
    • 4.1.8.RELEASE
    • 4.1.9.RELEASE
    • 4.2.0.RELEASE
    • 4.2.1.RELEASE
    • 4.2.2.RELEASE
    • 4.2.3.RELEASE
    • 4.2.4.RELEASE
    • 4.2.5.RELEASE
    • 4.2.6.RELEASE
    • 4.2.7.RELEASE
    • 4.2.8.RELEASE
    • 4.2.9.RELEASE
    • 4.3.0.RELEASE
    • 4.3.1.RELEASE
    • 4.3.2.RELEASE
    • 4.3.3.RELEASE
    • 4.3.4.RELEASE
    • 4.3.5.RELEASE
    • 4.3.6.RELEASE
    • 4.3.7.RELEASE
    • 4.3.8.RELEASE
    • 4.3.9.RELEASE
    • 4.3.10.RELEASE
    • 4.3.11.RELEASE
    • 4.3.12.RELEASE
    • 4.3.13.RELEASE
    • 4.3.14.RELEASE
    • 4.3.15.RELEASE
    • 4.3.16.RELEASE
    • 4.3.17.RELEASE
    • 4.3.18.RELEASE
    • 4.3.19.RELEASE
    • 4.3.20.RELEASE
    • 4.3.21.RELEASE
    • 4.3.22.RELEASE
    • 4.3.23.RELEASE
    • 4.3.24.RELEASE
    • 4.3.25.RELEASE
    • 4.3.26.RELEASE
    • 4.3.27.RELEASE
    • 4.3.28.RELEASE
    • 4.3.29.RELEASE
    • 4.3.30.RELEASE
    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • javax.servlet-api:4.x
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • 5.3.32
    • 5.3.33
    • 5.3.34
    • 5.3.35
    • 5.3.36
    • 5.3.37
    • 5.3.38
    • 5.3.39
    • javax.* -> jakarta.*
      jakarta.servlet-api:6.x
      Java 17 min
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.0.16
    • 6.0.17
    • 6.0.18
    • 6.0.19
    • 6.0.20
    • 6.0.21
    • 6.0.22
    • 6.0.23
    • 6.1.0
    • 6.1.1
    • 6.1.2
    • 6.1.3
    • 6.1.4
    • 6.1.5
    • 6.1.6
    • 6.1.7
    • 6.1.8
    • 6.1.9
    • 6.1.10
    • 6.1.11
    • 6.1.12
    • 6.1.13
    • 6.1.14
    • 6.1.15
    • 6.1.16
    • 6.1.17
    • 6.1.18
    • 6.1.19
    • 6.1.20
    • 6.1.21
    • 6.2.0
    • 6.2.1
    • 6.2.2
    • 6.2.3
    • 6.2.4
    • 6.2.5
    • 6.2.6
    • 6.2.7
    • 6.2.8
    • 6.2.9
    • 6.2.10
    • 6.2.11
    • 6.2.12
    • 6.2.13
    • 6.2.14
    • 6.2.15
    • 6.2.16
    • 6.2.17
    • 6.2.18
    • 6.2.19

    Versions in green have been tested.

  • jakarta.servlet-api 6.0.0 (Jakarta Servlet API documentation)
  • spring-test 6.0.0 (Spring TestContext Framework)
  • junit-jupiter-engine 5.8.2 (Module "junit-jupiter-engine" of JUnit 5)
  • hamcrest 3.0 (Core API and libraries of hamcrest matcher framework)
  • JDK 17
  • Maven 3.9.11

Spring MVC - RedirectView with Implicit Query params Example Select All Download
  • spring-redirect-view-with-auto-query-mapping
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • MyController.java
        • test
          • java
            • com
              • logicbig
                • example

    See Also

    Join