From 1784df8d3ee4c0ef27f78c56f393be94afe6d017 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 13 May 2011 18:06:55 +0000 Subject: [PATCH] SPR-6996 Add mvc:interceptor bean references --- .../InterceptorsBeanDefinitionParser.java | 26 +++++------ .../web/servlet/config/spring-mvc-3.1.xsd | 46 +++++++++++++------ .../web/servlet/config/MvcNamespaceTests.java | 15 +++--- .../config/mvc-config-interceptors.xml | 10 ++-- 4 files changed, 60 insertions(+), 37 deletions(-) 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 index 90a3afebff..d755a93eb5 100644 --- 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 @@ -19,7 +19,6 @@ 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.parsing.BeanComponentDefinition; import org.springframework.beans.factory.parsing.CompositeComponentDefinition; import org.springframework.beans.factory.support.RootBeanDefinition; @@ -42,35 +41,36 @@ class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element)); parserContext.pushContainingComponent(compDefinition); - List interceptors = DomUtils.getChildElementsByTagName(element, new String[] { "bean", "interceptor" }); + List interceptors = DomUtils.getChildElementsByTagName(element, new String[] { "bean", "ref", "interceptor" }); for (Element interceptor : interceptors) { RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class); mappedInterceptorDef.setSource(parserContext.extractSource(interceptor)); mappedInterceptorDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + String[] pathPatterns; - BeanDefinitionHolder interceptorDef; + Object interceptorBean; if ("interceptor".equals(interceptor.getLocalName())) { List paths = DomUtils.getChildElementsByTagName(interceptor, "mapping"); pathPatterns = new String[paths.size()]; for (int i = 0; i < paths.size(); i++) { pathPatterns[i] = paths.get(i).getAttribute("path"); } - Element interceptorBean = DomUtils.getChildElementByTagName(interceptor, "bean"); - interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptorBean); - interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptorBean, interceptorDef); - } else { + Element beanElem = DomUtils.getChildElementsByTagName(interceptor, new String[] { "bean", "ref"}).get(0); + interceptorBean = parserContext.getDelegate().parsePropertySubElement(beanElem, null); + } + else { pathPatterns = null; - interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptor); - interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, interceptorDef); + interceptorBean = parserContext.getDelegate().parsePropertySubElement(interceptor, null); } mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, pathPatterns); - mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, interceptorDef); - String mappedInterceptorName = parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef); - parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, mappedInterceptorName)); + mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, interceptorBean); + + String beanName = parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef); + parserContext.registerComponent(new BeanComponentDefinition(mappedInterceptorDef, beanName)); } parserContext.popAndRegisterContainingComponent(); return null; } - + } diff --git a/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd b/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd index 534b2965e4..e0a4fd793f 100644 --- a/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd +++ b/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.1.xsd @@ -223,13 +223,22 @@ - - - - - + + + + + + + + + + + + - - - - - + + + + + + + + + + + + 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 da551a309e..e811522dae 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 @@ -179,7 +179,7 @@ public class MvcNamespaceTests { @Test public void testInterceptors() throws Exception { - loadBeanDefinitions("mvc-config-interceptors.xml", 14); + loadBeanDefinitions("mvc-config-interceptors.xml", 16); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); @@ -191,20 +191,21 @@ 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()[0] instanceof ConversionServiceExposingInterceptor); assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor); - assertTrue(chain.getInterceptors()[2] instanceof ThemeChangeInterceptor); + assertTrue(chain.getInterceptors()[2] instanceof WebRequestHandlerInterceptorAdapter); + assertTrue(chain.getInterceptors()[3] instanceof ThemeChangeInterceptor); request.setRequestURI("/logged/accounts/12345"); chain = mapping.getHandler(request); - assertEquals(4, chain.getInterceptors().length); - assertTrue(chain.getInterceptors()[3] instanceof WebRequestHandlerInterceptorAdapter); + assertEquals(5, chain.getInterceptors().length); + assertTrue(chain.getInterceptors()[4] instanceof WebRequestHandlerInterceptorAdapter); request.setRequestURI("/foo/logged"); chain = mapping.getHandler(request); - assertEquals(4, chain.getInterceptors().length); - assertTrue(chain.getInterceptors()[3] instanceof WebRequestHandlerInterceptorAdapter); + assertEquals(5, chain.getInterceptors().length); + assertTrue(chain.getInterceptors()[4] instanceof WebRequestHandlerInterceptorAdapter); } @Test 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 27a9e06bc9..bc74d9b974 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 @@ -3,12 +3,13 @@ xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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-3.0.xsd"> + http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> + @@ -16,8 +17,11 @@ - + - + + +