diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index b226dbd836b..b723ff6dec4 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -55,7 +55,7 @@ import org.w3c.dom.Element; public class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { private static final boolean jsr303Present = ClassUtils.isPresent( - "javax.validation.Validator", InterceptorsBeanDefinitionParser.class.getClassLoader()); + "javax.validation.Validator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); public BeanDefinition parse(Element element, ParserContext parserContext) { @@ -64,6 +64,7 @@ public class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParse RootBeanDefinition annMappingDef = new RootBeanDefinition(DefaultAnnotationHandlerMapping.class); annMappingDef.setSource(source); annMappingDef.getPropertyValues().add("order", 0); + annMappingDef.getPropertyValues().add("detectInterceptors", true); String annMappingName = parserContext.getReaderContext().registerWithGeneratedName(annMappingDef); RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class); diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java deleted file mode 100644 index 7c111261588..00000000000 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2002-2009 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. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.web.servlet.config; - -import java.util.List; - -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.BeanDefinitionHolder; -import org.springframework.beans.factory.xml.BeanDefinitionParser; -import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.util.xml.DomUtils; -import org.springframework.web.servlet.HandlerInterceptor; -import org.w3c.dom.Element; - -/** - * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} that parses the {@code interceptors} element to configure - * a set of global Spring MVC {@link HandlerInterceptor HandlerInterceptors}. - * The set is expected to be configured by type on each registered HandlerMapping. - * - * @author Keith Donald - * @since 3.0 - */ -class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { - - public BeanDefinition parse(Element element, ParserContext parserContext) { - List beans = DomUtils.getChildElementsByTagName(element, "bean"); - for (Element bean : beans) { - BeanDefinitionHolder beanHolder = parserContext.getDelegate().parseBeanDefinitionElement(bean); - parserContext.getDelegate().decorateBeanDefinitionIfRequired(bean, beanHolder); - parserContext.getReaderContext().registerWithGeneratedName(beanHolder.getBeanDefinition()); - } - return null; - } - -} \ No newline at end of file diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcNamespaceHandler.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcNamespaceHandler.java index 9716fab6d66..4adbc6da955 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcNamespaceHandler.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcNamespaceHandler.java @@ -29,7 +29,6 @@ public class MvcNamespaceHandler extends NamespaceHandlerSupport { public void init() { registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser()); - registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser()); registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser()); } diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java index 9c298291a64..4c2352425d1 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java @@ -53,6 +53,7 @@ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class); handlerMappingDef.setSource(source); handlerMappingDef.getPropertyValues().add("order", "1"); + handlerMappingDef.getPropertyValues().add("detectInterceptors", true); this.handlerMappingBeanName = parserContext.getReaderContext().registerWithGeneratedName(handlerMappingDef); } else { handlerMappingDef = (RootBeanDefinition) parserContext.getReaderContext().getRegistry().getBeanDefinition(this.handlerMappingBeanName); diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java index 9fba6369ea2..edfb657bc6c 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/AbstractHandlerMapping.java @@ -57,6 +57,7 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport private HandlerInterceptor[] adaptedInterceptors; + private boolean detectInterceptors; /** * Specify the order value for this HandlerMapping bean. @@ -100,6 +101,15 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport this.interceptors.addAll(Arrays.asList(interceptors)); } + /** + * Configure whether this handler mapping should detect interceptors registered in the WebApplicationContext. + * If true, {@link HandlerInterceptor} and {@link WebRequestInterceptor} beans will be detected by type and added to the interceptors list. + * Default is false. + * @param detectInterceptors the detect interceptors flag + */ + public void setDetectInterceptors(boolean detectInterceptors) { + this.detectInterceptors = detectInterceptors; + } /** * Initializes the interceptors. @@ -131,10 +141,17 @@ public abstract class AbstractHandlerMapping extends WebApplicationObjectSupport * @see #adaptInterceptor */ protected void initInterceptors() { - // TODO consider impact on backwards compatibility here - Map globalInterceptors = getApplicationContext().getBeansOfType(HandlerInterceptor.class); - if (globalInterceptors != null) { - this.interceptors.addAll(globalInterceptors.values()); + if (this.detectInterceptors) { + Map handlerInterceptors = getApplicationContext().getBeansOfType(HandlerInterceptor.class); + if (handlerInterceptors != null && !handlerInterceptors.isEmpty()) { + this.interceptors.addAll(handlerInterceptors.values()); + } + Map webInterceptors = getApplicationContext().getBeansOfType(WebRequestInterceptor.class); + if (webInterceptors != null && !webInterceptors.isEmpty()) { + for (WebRequestInterceptor interceptor : webInterceptors.values()) { + this.interceptors.add(new WebRequestHandlerInterceptorAdapter(interceptor)); + } + } } if (!this.interceptors.isEmpty()) { diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java index 963ee151bdf..0b42b59a36e 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java @@ -48,10 +48,12 @@ import org.springframework.validation.Validator; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.context.request.Log4jNestedDiagnosticContextInterceptor; import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.servlet.HandlerExecutionChain; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; +import org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter; import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; @@ -145,7 +147,7 @@ public class MvcNamespaceTests { public void testInterceptors() throws Exception { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container); reader.loadBeanDefinitions(new ClassPathResource("mvc-config-interceptors.xml", getClass())); - assertEquals(6, container.getBeanDefinitionCount()); + assertEquals(7, container.getBeanDefinitionCount()); container.refresh(); DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class); @@ -157,9 +159,10 @@ public class MvcNamespaceTests { request.addParameter("theme", "green"); HandlerExecutionChain chain = mapping.getHandler(request); - assertEquals(3, chain.getInterceptors().length); + assertEquals(4, chain.getInterceptors().length); assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor); assertTrue(chain.getInterceptors()[2] instanceof ThemeChangeInterceptor); + assertTrue(chain.getInterceptors()[3] instanceof WebRequestHandlerInterceptorAdapter); } @Test diff --git a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-bean-decoration.xml b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-bean-decoration.xml index 6d5fd4da234..d6fd840004c 100644 --- a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-bean-decoration.xml +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-bean-decoration.xml @@ -8,9 +8,6 @@ - - - - - + + diff --git a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-interceptors.xml b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-interceptors.xml index 6fd3dcd7aad..82d8e063904 100644 --- a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-interceptors.xml +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-interceptors.xml @@ -7,9 +7,8 @@ - - - - - + + + + diff --git a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers.xml b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers.xml index 785bf5974f5..55eae52f90d 100644 --- a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers.xml +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers.xml @@ -11,9 +11,7 @@ - - - - - + + +