From 153a23dbf9a4b08acb16014c52dd20d9105943f3 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 4 Dec 2015 13:09:37 -0500 Subject: [PATCH] Configure view controllers with ApplicationContext Issue: SPR-13762 --- .../RedirectViewControllerRegistration.java | 7 +++++- .../ViewControllerRegistration.java | 6 ++++- .../annotation/ViewControllerRegistry.java | 12 +++++++++- .../WebMvcConfigurationSupport.java | 1 + .../ViewControllerRegistryTests.java | 23 +++++++++++++------ 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/RedirectViewControllerRegistration.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/RedirectViewControllerRegistration.java index 6bf1a8163c6..7a0fb28266b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/RedirectViewControllerRegistration.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/RedirectViewControllerRegistration.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.web.servlet.config.annotation; +import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.util.Assert; import org.springframework.web.servlet.mvc.ParameterizableViewController; @@ -81,6 +82,10 @@ public class RedirectViewControllerRegistration { return this; } + protected void setApplicationContext(ApplicationContext applicationContext) { + this.controller.setApplicationContext(applicationContext); + this.redirectView.setApplicationContext(applicationContext); + } protected String getUrlPath() { return this.urlPath; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistration.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistration.java index f09c9e909bf..a494b7455a2 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistration.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistration.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.web.servlet.config.annotation; +import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.util.Assert; import org.springframework.web.servlet.RequestToViewNameTranslator; @@ -65,6 +66,9 @@ public class ViewControllerRegistration { this.controller.setViewName(viewName); } + protected void setApplicationContext(ApplicationContext applicationContext) { + this.controller.setApplicationContext(applicationContext); + } protected String getUrlPath() { return this.urlPath; diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java index 8b7fc6073c3..3a2de78a4de 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.springframework.context.ApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.web.servlet.handler.AbstractHandlerMapping; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; @@ -42,6 +43,8 @@ public class ViewControllerRegistry { private int order = 1; + private ApplicationContext applicationContext; + /** * Map a view controller to the given URL path (or pattern) in order to render @@ -49,6 +52,7 @@ public class ViewControllerRegistry { */ public ViewControllerRegistration addViewController(String urlPath) { ViewControllerRegistration registration = new ViewControllerRegistration(urlPath); + registration.setApplicationContext(this.applicationContext); this.registrations.add(registration); return registration; } @@ -61,6 +65,7 @@ public class ViewControllerRegistry { */ public RedirectViewControllerRegistration addRedirectViewController(String urlPath, String redirectUrl) { RedirectViewControllerRegistration registration = new RedirectViewControllerRegistration(urlPath, redirectUrl); + registration.setApplicationContext(this.applicationContext); this.redirectRegistrations.add(registration); return registration; } @@ -72,6 +77,7 @@ public class ViewControllerRegistry { */ public void addStatusController(String urlPath, HttpStatus statusCode) { ViewControllerRegistration registration = new ViewControllerRegistration(urlPath); + registration.setApplicationContext(this.applicationContext); registration.setStatusCode(statusCode); registration.getViewController().setStatusOnly(true); this.registrations.add(registration); @@ -87,6 +93,10 @@ public class ViewControllerRegistry { this.order = order; } + protected void setApplicationContext(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + /** * Return the {@code HandlerMapping} that contains the registered view diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index a34b8864131..37976905161 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -364,6 +364,7 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv @Bean public HandlerMapping viewControllerHandlerMapping() { ViewControllerRegistry registry = new ViewControllerRegistry(); + registry.setApplicationContext(this.applicationContext); addViewControllers(registry); AbstractHandlerMapping handlerMapping = registry.getHandlerMapping(); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistryTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistryTests.java index 1ccb422f16e..486023f8c03 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistryTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewControllerRegistryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import java.util.Map; import org.junit.Before; import org.junit.Test; +import org.springframework.context.support.StaticApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockHttpServletResponse; @@ -48,6 +49,7 @@ public class ViewControllerRegistryTests { @Before public void setUp() { this.registry = new ViewControllerRegistry(); + this.registry.setApplicationContext(new StaticApplicationContext()); this.request = new MockHttpServletRequest("GET", "/"); this.response = new MockHttpServletResponse(); } @@ -61,18 +63,22 @@ public class ViewControllerRegistryTests { public void addViewController() { this.registry.addViewController("/path").setViewName("viewName"); ParameterizableViewController controller = getController("/path"); + assertEquals("viewName", controller.getViewName()); assertNull(controller.getStatusCode()); assertFalse(controller.isStatusOnly()); + assertNotNull(controller.getApplicationContext()); } @Test public void addViewControllerWithDefaultViewName() { this.registry.addViewController("/path"); ParameterizableViewController controller = getController("/path"); + assertNull(controller.getViewName()); assertNull(controller.getStatusCode()); assertFalse(controller.isStatusOnly()); + assertNotNull(controller.getApplicationContext()); } @Test @@ -85,6 +91,7 @@ public class ViewControllerRegistryTests { assertEquals(302, this.response.getStatus()); assertEquals("/context/redirectTo", this.response.getRedirectedUrl()); + assertNotNull(redirectView.getApplicationContext()); } @Test @@ -101,18 +108,20 @@ public class ViewControllerRegistryTests { assertEquals(308, this.response.getStatus()); assertEquals("/redirectTo?a=b", response.getRedirectedUrl()); + assertNotNull(redirectView.getApplicationContext()); } @Test public void addStatusController() { this.registry.addStatusController("/path", HttpStatus.NOT_FOUND); ParameterizableViewController controller = getController("/path"); + assertNull(controller.getViewName()); assertEquals(HttpStatus.NOT_FOUND, controller.getStatusCode()); assertTrue(controller.isStatusOnly()); + assertNotNull(controller.getApplicationContext()); } - @Test public void order() { this.registry.addViewController("/path"); @@ -124,6 +133,7 @@ public class ViewControllerRegistryTests { assertEquals(2, handlerMapping.getOrder()); } + private ParameterizableViewController getController(String path) { Map urlMap = getHandlerMapping().getUrlMap(); ParameterizableViewController controller = (ParameterizableViewController) urlMap.get(path); @@ -131,17 +141,16 @@ public class ViewControllerRegistryTests { return controller; } - private SimpleUrlHandlerMapping getHandlerMapping() { - return (SimpleUrlHandlerMapping) this.registry.getHandlerMapping(); - } - private RedirectView getRedirectView(String path) { - ParameterizableViewController controller = getController("/path"); + ParameterizableViewController controller = getController(path); assertNull(controller.getViewName()); assertNotNull(controller.getView()); assertEquals(RedirectView.class, controller.getView().getClass()); return (RedirectView) controller.getView(); } + private SimpleUrlHandlerMapping getHandlerMapping() { + return (SimpleUrlHandlerMapping) this.registry.getHandlerMapping(); + } }