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 1cf81f302ff..d82341ae0d8 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 @@ -37,16 +37,28 @@ import org.w3c.dom.Element; class InterceptorsBeanDefinitionParser implements BeanDefinitionParser { public BeanDefinition parse(Element element, ParserContext parserContext) { - List interceptors = DomUtils.getChildElementsByTagName(element, "interceptor"); + List interceptors = DomUtils.getChildElementsByTagName(element, new String[] { "bean", "interceptor" }); for (Element interceptor : interceptors) { RootBeanDefinition mappedInterceptorDef = new RootBeanDefinition(MappedInterceptor.class); - mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, interceptor.getAttribute("path")); - RootBeanDefinition interceptorDef = new RootBeanDefinition(interceptor.getAttribute("class")); - BeanDefinitionHolder holder = new BeanDefinitionHolder(interceptorDef, parserContext.getReaderContext().generateBeanName(interceptorDef)); - holder = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, holder); - parserContext.getDelegate().parseConstructorArgElements(interceptor, interceptorDef); - parserContext.getDelegate().parsePropertyElements(interceptor, interceptorDef); - mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, holder); + mappedInterceptorDef.setSource(parserContext.extractSource(interceptor)); + String[] pathPatterns; + BeanDefinitionHolder interceptorDef; + if ("interceptor".equals(interceptor.getLocalName())) { + List paths = DomUtils.getChildElementsByTagName(interceptor, "path"); + pathPatterns = new String[paths.size()]; + for (int i = 0; i < paths.size(); i++) { + pathPatterns[i] = paths.get(i).getAttribute("value"); + } + Element interceptorBean = DomUtils.getChildElementByTagName(interceptor, "bean"); + interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptorBean); + interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptorBean, interceptorDef); + } else { + pathPatterns = null; + interceptorDef = parserContext.getDelegate().parseBeanDefinitionElement(interceptor); + interceptorDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(interceptor, interceptorDef); + } + mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(0, pathPatterns); + mappedInterceptorDef.getConstructorArgumentValues().addIndexedArgumentValue(1, interceptorDef); parserContext.getReaderContext().registerWithGeneratedName(mappedInterceptorDef); } return null; diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java index d3ef17c33ef..60260be3820 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptor.java @@ -25,7 +25,7 @@ import org.springframework.web.servlet.HandlerInterceptor; */ public final class MappedInterceptor { - private final String pathPattern; + private final String[] pathPatterns; private final HandlerInterceptor interceptor; @@ -34,8 +34,8 @@ public final class MappedInterceptor { * @param pathPattern the path pattern * @param interceptor the interceptor */ - public MappedInterceptor(String pathPattern, HandlerInterceptor interceptor) { - this.pathPattern = pathPattern; + public MappedInterceptor(String[] pathPatterns, HandlerInterceptor interceptor) { + this.pathPatterns = pathPatterns; this.interceptor = interceptor; } @@ -44,16 +44,16 @@ public final class MappedInterceptor { * @param pathPattern the path pattern * @param interceptor the interceptor */ - public MappedInterceptor(String pathPattern, WebRequestInterceptor interceptor) { - this.pathPattern = pathPattern; + public MappedInterceptor(String[] pathPatterns, WebRequestInterceptor interceptor) { + this.pathPatterns = pathPatterns; this.interceptor = new WebRequestHandlerInterceptorAdapter(interceptor); } /** * The path into the application the interceptor is mapped to. */ - public String getPathPattern() { - return pathPattern; + public String[] getPathPatterns() { + return pathPatterns; } /** diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptors.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptors.java index 3e1550c47ac..b9ae883975e 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptors.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/handler/MappedInterceptors.java @@ -4,7 +4,6 @@ import java.util.LinkedHashSet; import java.util.Set; import org.springframework.util.PathMatcher; -import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; class MappedInterceptors { @@ -26,9 +25,14 @@ class MappedInterceptors { } private boolean matches(MappedInterceptor interceptor, String lookupPath, PathMatcher pathMatcher) { - String pathPattern = interceptor.getPathPattern(); - if (StringUtils.hasText(pathPattern)) { - return pathMatcher.match(pathPattern, lookupPath); + String[] pathPatterns = interceptor.getPathPatterns(); + if (pathPatterns != null) { + for (String pattern : pathPatterns) { + if (pathMatcher.match(pattern, lookupPath)) { + return true; + } + } + return false; } else { return true; } diff --git a/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.0.xsd b/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.0.xsd index 221cfd45fb0..0929de414e3 100644 --- a/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.0.xsd +++ b/org.springframework.web.servlet/src/main/resources/org/springframework/web/servlet/config/spring-mvc-3.0.xsd @@ -50,52 +50,54 @@ - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + 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 9d000a864b6..b9f8eeea1d1 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 @@ -35,7 +35,6 @@ import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.ConversionService; import org.springframework.core.io.ClassPathResource; -import org.springframework.core.style.StylerUtils; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat.ISO; import org.springframework.format.support.FormattingConversionServiceFactoryBean; @@ -49,7 +48,6 @@ 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; @@ -170,6 +168,11 @@ public class MvcNamespaceTests { assertEquals(4, chain.getInterceptors().length); assertTrue(chain.getInterceptors()[3] instanceof WebRequestHandlerInterceptorAdapter); + request.setRequestURI("/foo/logged"); + chain = mapping.getHandler(request); + assertEquals(4, chain.getInterceptors().length); + 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 bc3dcabd5c7..2a4f5990038 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 @@ -9,10 +9,10 @@ - - + + - + 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 6d85375308b..691300f9232 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 @@ -8,9 +8,16 @@ - - - + + + + + + + + + + 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 878b008f1fa..1d0b296d5f8 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 @@ -12,8 +12,8 @@ - - + +