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 07622098b75..740e964901b 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 @@ -16,9 +16,11 @@ package org.springframework.web.servlet.config; -import org.w3c.dom.Element; +import java.util.ArrayList; +import java.util.List; import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.parsing.CompositeComponentDefinition; @@ -28,11 +30,13 @@ import org.springframework.beans.factory.xml.ParserContext; import org.springframework.core.convert.ConversionService; import org.springframework.format.support.FormattingConversionServiceFactoryBean; import org.springframework.util.ClassUtils; +import org.springframework.util.xml.DomUtils; import org.springframework.validation.Validator; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping; +import org.w3c.dom.Element; /** * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} that parses the {@code annotation-driven} element to configure @@ -67,6 +71,16 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { mappingDef.getPropertyValues().add("order", 0); String mappingName = parserContext.getReaderContext().registerWithGeneratedName(mappingDef); + Element interceptors = DomUtils.getChildElementByTagName(element, "interceptors"); + if (interceptors != null) { + List beans = DomUtils.getChildElementsByTagName(interceptors, "bean"); + List interceptorBeans = new ArrayList(beans.size()); + for (Element bean : beans) { + interceptorBeans.add(parserContext.getDelegate().parseBeanDefinitionElement(bean).getBeanDefinition()); + } + mappingDef.getPropertyValues().add("interceptors", interceptorBeans); + } + RootBeanDefinition bindingDef = new RootBeanDefinition(ConfigurableWebBindingInitializer.class); bindingDef.setSource(source); bindingDef.getPropertyValues().add("conversionService", getConversionService(element, source, parserContext)); 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 0a8463725e7..8bc0dbe28f5 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 @@ -22,7 +22,7 @@ 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 b3bfeee9f42..08727f39985 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 @@ -16,15 +16,20 @@ package org.springframework.web.servlet.config; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import java.util.Date; import java.util.Locale; + import javax.validation.Valid; import javax.validation.constraints.NotNull; -import static org.junit.Assert.*; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; - import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.core.convert.ConversionFailedException; @@ -44,8 +49,11 @@ 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.support.GenericWebApplicationContext; +import org.springframework.web.servlet.HandlerExecutionChain; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping; +import org.springframework.web.servlet.theme.ThemeChangeInterceptor; /** * @author Keith Donald @@ -132,16 +140,22 @@ public class MvcNamespaceTests { } @Test + @Ignore public void testInterceptors() throws Exception { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container); reader.loadBeanDefinitions(new ClassPathResource("mvc-config-interceptors.xml", getClass())); assertEquals(4, container.getBeanDefinitionCount()); DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class); assertNotNull(mapping); - assertEquals(0, mapping.getOrder()); - AnnotationMethodHandlerAdapter adapter = container.getBean(AnnotationMethodHandlerAdapter.class); - assertNotNull(adapter); - assertNotNull(container.getBean(FormattingConversionServiceFactoryBean.class)); + mapping.setRootHandler(new TestController()); + MockHttpServletRequest request = new MockHttpServletRequest(); + request.addParameter("locale", "en"); + request.addParameter("theme", "green"); + + HandlerExecutionChain chain = mapping.getHandler(request); + assertEquals(2, chain.getInterceptors().length); + assertTrue(chain.getInterceptors()[0] instanceof LocaleChangeInterceptor); + assertTrue(chain.getInterceptors()[1] instanceof ThemeChangeInterceptor); } @Controller