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 ProjectDependencies and Technologies Used: - spring-webmvc 6.0.0 (Spring Web MVC)
Version Compatibility: 3.2.9.RELEASE - 6.2.19 Version compatibilities of spring-webmvc with this example: 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
|