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 a61d7f1304b..b226dbd836b 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,20 +16,16 @@ package org.springframework.web.servlet.config; -import java.util.List; - import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.parsing.CompositeComponentDefinition; -import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; 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; @@ -56,44 +52,34 @@ import org.w3c.dom.Element; * @author Juergen Hoeller * @since 3.0 */ -class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { +public class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { private static final boolean jsr303Present = ClassUtils.isPresent( - "javax.validation.Validator", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); + "javax.validation.Validator", InterceptorsBeanDefinitionParser.class.getClassLoader()); public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); - RootBeanDefinition mappingDef = new RootBeanDefinition(DefaultAnnotationHandlerMapping.class); - mappingDef.setSource(source); - mappingDef.getPropertyValues().add("order", 0); - String mappingName = parserContext.getReaderContext().registerWithGeneratedName(mappingDef); + RootBeanDefinition annMappingDef = new RootBeanDefinition(DefaultAnnotationHandlerMapping.class); + annMappingDef.setSource(source); + annMappingDef.getPropertyValues().add("order", 0); + String annMappingName = parserContext.getReaderContext().registerWithGeneratedName(annMappingDef); - Element interceptors = DomUtils.getChildElementByTagName(element, "interceptors"); - if (interceptors != null) { - List beans = DomUtils.getChildElementsByTagName(interceptors, "bean"); - List interceptorBeans = new ManagedList(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)); bindingDef.getPropertyValues().add("validator", getValidator(element, source, parserContext)); - RootBeanDefinition adapterDef = new RootBeanDefinition(AnnotationMethodHandlerAdapter.class); - adapterDef.setSource(source); - adapterDef.getPropertyValues().add("webBindingInitializer", bindingDef); - String adapterName = parserContext.getReaderContext().registerWithGeneratedName(adapterDef); + RootBeanDefinition annAdapterDef = new RootBeanDefinition(AnnotationMethodHandlerAdapter.class); + annAdapterDef.setSource(source); + annAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef); + String adapterName = parserContext.getReaderContext().registerWithGeneratedName(annAdapterDef); CompositeComponentDefinition compDefinition = new CompositeComponentDefinition(element.getTagName(), source); parserContext.pushContainingComponent(compDefinition); - parserContext.registerComponent(new BeanComponentDefinition(mappingDef, mappingName)); - parserContext.registerComponent(new BeanComponentDefinition(adapterDef, adapterName)); + parserContext.registerComponent(new BeanComponentDefinition(annMappingDef, annMappingName)); + parserContext.registerComponent(new BeanComponentDefinition(annAdapterDef, adapterName)); parserContext.popAndRegisterContainingComponent(); return null; 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 new file mode 100644 index 00000000000..7c111261588 --- /dev/null +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/InterceptorsBeanDefinitionParser.java @@ -0,0 +1,49 @@ +/* + * 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 c295b11b476..9716fab6d66 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,6 +29,8 @@ 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 new file mode 100644 index 00000000000..9c298291a64 --- /dev/null +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ViewControllerBeanDefinitionParser.java @@ -0,0 +1,76 @@ +/* + * 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.Map; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.ManagedMap; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.beans.factory.xml.BeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; +import org.springframework.web.servlet.mvc.ParameterizableViewController; +import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter; +import org.w3c.dom.Element; + +/** + * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} that parses a {@code view-controller} element to register + * a {@link ParameterizableViewController}. Will also register a {@link SimpleUrlHandlerMapping} for view controllers. + * + * @author Keith Donald + * @since 3.0 + */ +class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { + + private String handlerAdapterBeanName; + + private String handlerMappingBeanName; + + public BeanDefinition parse(Element element, ParserContext parserContext) { + Object source = parserContext.extractSource(element); + if (this.handlerAdapterBeanName == null) { + RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); + handlerAdapterDef.setSource(source); + this.handlerAdapterBeanName = parserContext.getReaderContext().registerWithGeneratedName(handlerAdapterDef); + } + RootBeanDefinition handlerMappingDef; + if (this.handlerMappingBeanName == null) { + handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class); + handlerMappingDef.setSource(source); + handlerMappingDef.getPropertyValues().add("order", "1"); + this.handlerMappingBeanName = parserContext.getReaderContext().registerWithGeneratedName(handlerMappingDef); + } else { + handlerMappingDef = (RootBeanDefinition) parserContext.getReaderContext().getRegistry().getBeanDefinition(this.handlerMappingBeanName); + } + RootBeanDefinition viewControllerDef = new RootBeanDefinition(ParameterizableViewController.class); + viewControllerDef.setSource(source); + if (element.hasAttribute("view-name")) { + viewControllerDef.getPropertyValues().add("viewName", element.getAttribute("view-name")); + } + Map urlMap; + if (handlerMappingDef.getPropertyValues().contains("urlMap")) { + urlMap = (Map) handlerMappingDef.getPropertyValues().getPropertyValue("urlMap").getValue(); + } else { + urlMap = new ManagedMap(); + handlerMappingDef.getPropertyValues().add("urlMap", urlMap); + } + urlMap.put(element.getAttribute("path"), viewControllerDef); + return null; + } + +} 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 5ad07788060..9fba6369ea2 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 @@ -19,6 +19,7 @@ package org.springframework.web.servlet.handler; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -130,6 +131,12 @@ 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.interceptors.isEmpty()) { this.adaptedInterceptors = new HandlerInterceptor[this.interceptors.size()]; for (int i = 0; i < this.interceptors.size(); i++) { diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java index 3ab6a819f55..b444e003494 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/ParameterizableViewController.java @@ -56,14 +56,15 @@ import org.springframework.web.servlet.ModelAndView; * viewName * null * the name of the view the viewResolver will use to forward to - * (if this property is not set, an exception will be thrown during - * initialization) + * (if this property is not set, a null view name will be returned + * directing the caller to calculate the view name from the current request) * * *

* * @author Rod Johnson * @author Juergen Hoeller + * @author Keith Donald */ public class ParameterizableViewController extends AbstractController { @@ -84,14 +85,6 @@ public class ParameterizableViewController extends AbstractController { return this.viewName; } - @Override - protected void initApplicationContext() { - if (this.viewName == null) { - throw new IllegalArgumentException("Property 'viewName' is required"); - } - } - - /** * Return a ModelAndView object with the specified view name. * @see #getViewName() @@ -99,7 +92,6 @@ public class ParameterizableViewController extends AbstractController { @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { - return new ModelAndView(getViewName()); } 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 8bc0dbe28f5..bbaa5dd9a4c 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 @@ -16,22 +16,6 @@ ]]> - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 69a175f53c6..963ee151bdf 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 @@ -19,6 +19,7 @@ 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.assertNull; import static org.junit.Assert.assertTrue; import java.util.Date; @@ -34,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; @@ -50,7 +50,10 @@ 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.ModelAndView; +import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter; import org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter; import org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping; import org.springframework.web.servlet.theme.ThemeChangeInterceptor; @@ -79,6 +82,7 @@ public class MvcNamespaceTests { 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)); @@ -103,12 +107,8 @@ public class MvcNamespaceTests { assertEquals(4, container.getBeanDefinitionCount()); container.refresh(); - DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class); - assertNotNull(mapping); - assertEquals(0, mapping.getOrder()); AnnotationMethodHandlerAdapter adapter = container.getBean(AnnotationMethodHandlerAdapter.class); assertNotNull(adapter); - assertNotNull(container.getBean(LocalValidatorFactoryBean.class)); TestController handler = new TestController(); @@ -126,12 +126,8 @@ public class MvcNamespaceTests { assertEquals(4, container.getBeanDefinitionCount()); container.refresh(); - 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)); TestController handler = new TestController(); @@ -149,12 +145,13 @@ public class MvcNamespaceTests { public void testInterceptors() throws Exception { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container); reader.loadBeanDefinitions(new ClassPathResource("mvc-config-interceptors.xml", getClass())); - assertEquals(4, container.getBeanDefinitionCount()); + assertEquals(6, container.getBeanDefinitionCount()); container.refresh(); DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class); assertNotNull(mapping); - mapping.setRootHandler(new TestController()); + mapping.setDefaultHandler(new TestController()); + MockHttpServletRequest request = new MockHttpServletRequest(); request.addParameter("locale", "en"); request.addParameter("theme", "green"); @@ -165,6 +162,65 @@ public class MvcNamespaceTests { assertTrue(chain.getInterceptors()[2] instanceof ThemeChangeInterceptor); } + @Test + public void testBeanDecoration() throws Exception { + XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container); + reader.loadBeanDefinitions(new ClassPathResource("mvc-config-bean-decoration.xml", getClass())); + assertEquals(5, container.getBeanDefinitionCount()); + container.refresh(); + + DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class); + assertNotNull(mapping); + mapping.setDefaultHandler(new TestController()); + + MockHttpServletRequest request = new MockHttpServletRequest(); + + HandlerExecutionChain chain = mapping.getHandler(request); + assertEquals(2, chain.getInterceptors().length); + assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor); + LocaleChangeInterceptor interceptor = (LocaleChangeInterceptor) chain.getInterceptors()[1]; + assertEquals("lang", interceptor.getParamName()); + } + + @Test + public void testViewControllers() throws Exception { + XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(container); + reader.loadBeanDefinitions(new ClassPathResource("mvc-config-view-controllers.xml", getClass())); + assertEquals(8, container.getBeanDefinitionCount()); + container.refresh(); + + DefaultAnnotationHandlerMapping mapping = container.getBean(DefaultAnnotationHandlerMapping.class); + assertNotNull(mapping); + mapping.setDefaultHandler(new TestController()); + + MockHttpServletRequest request = new MockHttpServletRequest(); + + HandlerExecutionChain chain = mapping.getHandler(request); + assertEquals(3, chain.getInterceptors().length); + assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor); + + SimpleUrlHandlerMapping mapping2 = container.getBean(SimpleUrlHandlerMapping.class); + assertNotNull(mapping2); + + SimpleControllerHandlerAdapter adapter = container.getBean(SimpleControllerHandlerAdapter.class); + assertNotNull(adapter); + + request.setRequestURI("/foo"); + request.setMethod("GET"); + chain = mapping2.getHandler(request); + assertEquals(3, chain.getInterceptors().length); + assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor); + ModelAndView mv = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler()); + assertNull(mv.getViewName()); + + request.setRequestURI("/bar"); + chain = mapping2.getHandler(request); + assertEquals(3, chain.getInterceptors().length); + assertTrue(chain.getInterceptors()[1] instanceof LocaleChangeInterceptor); + ModelAndView mv2 = adapter.handle(request, new MockHttpServletResponse(), chain.getHandler()); + assertEquals("baz", mv2.getViewName()); + } + @Controller public static class TestController { 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 new file mode 100644 index 00000000000..6d5fd4da234 --- /dev/null +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-bean-decoration.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + 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 f7b031bbb1b..6fd3dcd7aad 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 @@ -5,11 +5,11 @@ 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"> - - - - - - + + + + + + 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 new file mode 100644 index 00000000000..785bf5974f5 --- /dev/null +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config.xml b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config.xml index 032b2b4ba77..1b0b4c7212e 100644 --- a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config.xml +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config.xml @@ -5,6 +5,6 @@ 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"> - - + +