diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AbstractHttpRequestHandlerBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AbstractHttpRequestHandlerBeanDefinitionParser.java deleted file mode 100644 index 13f10cf673b..00000000000 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/AbstractHttpRequestHandlerBeanDefinitionParser.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2002-2010 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 org.w3c.dom.Element; - -import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.parsing.BeanComponentDefinition; -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.mvc.HttpRequestHandlerAdapter; - -/** - * Abstract base class for {@link BeanDefinitonParser}s that register an HttpRequestHandler. - * - * @author Jeremy Grelle - * @since 3.0.4 - */ -abstract class AbstractHttpRequestHandlerBeanDefinitionParser implements BeanDefinitionParser{ - - private static final String HANDLER_ADAPTER_BEAN_NAME = "org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"; - - public BeanDefinition parse(Element element, ParserContext parserContext) { - Object source = parserContext.extractSource(element); - registerHandlerAdapterIfNecessary(parserContext, source); - doParse(element, parserContext); - return null; - } - - public abstract void doParse(Element element, ParserContext parserContext); - - private void registerHandlerAdapterIfNecessary(ParserContext parserContext, Object source) { - if (!parserContext.getRegistry().containsBeanDefinition(HANDLER_ADAPTER_BEAN_NAME)) { - RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(HttpRequestHandlerAdapter.class); - handlerAdapterDef.setSource(source); - handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - parserContext.getRegistry().registerBeanDefinition(HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef); - parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); - } - } - -} 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 ffbeef954f1..f0401b5b53b 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 @@ -45,6 +45,7 @@ import org.springframework.validation.Validator; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.bind.support.WebArgumentResolver; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor; import org.springframework.web.servlet.handler.MappedInterceptor; import org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver; @@ -98,7 +99,6 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { private static boolean romePresent = ClassUtils.isPresent("com.sun.syndication.feed.WireFeed", AnnotationDrivenBeanDefinitionParser.class.getClassLoader()); - public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); @@ -177,6 +177,13 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { parserContext.registerComponent(new BeanComponentDefinition(responseStatusExceptionResolver, responseStatusExceptionResolverName)); parserContext.registerComponent(new BeanComponentDefinition(defaultExceptionResolver, defaultExceptionResolverName)); parserContext.registerComponent(new BeanComponentDefinition(mappedCsInterceptorDef, mappedInterceptorName)); + + // Ensure BeanNameUrlHandlerMapping is not "turned off" (SPR-8289) + MvcNamespaceUtils.registerBeanNameUrlHandlerMapping(parserContext, source); + + // Ensure default HandlerAdapters are not "turned off" + MvcNamespaceUtils.registerDefaultHandlerAdapters(parserContext, source); + parserContext.popAndRegisterContainingComponent(); return null; @@ -317,4 +324,5 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return result; } + } diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/DefaultServletHandlerBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/DefaultServletHandlerBeanDefinitionParser.java index fe60722234d..3753d02e539 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/DefaultServletHandlerBeanDefinitionParser.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/DefaultServletHandlerBeanDefinitionParser.java @@ -35,15 +35,15 @@ import org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler * {@link BeanDefinitionParser} that parses a {@code default-servlet-handler} element to * register a {@link DefaultServletHttpRequestHandler}. Will also register a * {@link SimpleUrlHandlerMapping} for mapping resource requests, and a - * {@link HttpRequestHandlerAdapter} if necessary. + * {@link HttpRequestHandlerAdapter}. * * @author Jeremy Grelle + * @author Rossen Stoyanchev * @since 3.0.4 */ -class DefaultServletHandlerBeanDefinitionParser extends AbstractHttpRequestHandlerBeanDefinitionParser { +class DefaultServletHandlerBeanDefinitionParser implements BeanDefinitionParser { - @Override - public void doParse(Element element, ParserContext parserContext) { + public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); String defaultServletName = element.getAttribute("default-servlet-name"); @@ -68,6 +68,14 @@ class DefaultServletHandlerBeanDefinitionParser extends AbstractHttpRequestHandl String handlerMappingBeanName = parserContext.getReaderContext().generateBeanName(handlerMappingDef); parserContext.getRegistry().registerBeanDefinition(handlerMappingBeanName, handlerMappingDef); parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, handlerMappingBeanName)); + + // Ensure BeanNameUrlHandlerMapping is not "turned off" (SPR-8289) + MvcNamespaceUtils.registerBeanNameUrlHandlerMapping(parserContext, source); + + // Register HttpRequestHandlerAdapter + MvcNamespaceUtils.registerDefaultHandlerAdapters(parserContext, source); + + return null; } } diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java new file mode 100644 index 00000000000..96a74b87d9f --- /dev/null +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/MvcNamespaceUtils.java @@ -0,0 +1,80 @@ +/* + * Copyright 2002-2010 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 org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.parsing.BeanComponentDefinition; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; +import org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter; +import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter; + +/** + * Convenience methods for MVC namespace handlers. + * + * @author Rossen Stoyanchev + * @since 3.1 + */ +abstract class MvcNamespaceUtils { + + private static final String BEAN_NAME_URL_HANDLER_MAPPING = + "org.springframework.web.servlet.handler.beanNameUrlHandlerMapping"; + + private static final String VIEW_CONTROLLER_HANDLER_ADAPTER = + "org.springframework.web.servlet.config.viewControllerHandlerAdapter"; + + private static final String HTTP_REQUEST_HANDLER_ADAPTER = + "org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"; + + public static void registerDefaultHandlerAdapters(ParserContext parserContext, Object source) { + registerHttpRequestHandlerAdapter(parserContext, source); + registerSimpleControllerHandlerAdapter(parserContext, source); + } + + public static void registerBeanNameUrlHandlerMapping(ParserContext parserContext, Object source) { + if (!parserContext.getRegistry().containsBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING)){ + RootBeanDefinition beanNameMappingDef = new RootBeanDefinition(BeanNameUrlHandlerMapping.class); + beanNameMappingDef.setSource(source); + beanNameMappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + beanNameMappingDef.getPropertyValues().add("order", 2); // consistent with MvcConfiguration + parserContext.getRegistry().registerBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING, beanNameMappingDef); + parserContext.registerComponent(new BeanComponentDefinition(beanNameMappingDef, BEAN_NAME_URL_HANDLER_MAPPING)); + } + } + + public static void registerHttpRequestHandlerAdapter(ParserContext parserContext, Object source) { + if (!parserContext.getRegistry().containsBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER)) { + RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(HttpRequestHandlerAdapter.class); + handlerAdapterDef.setSource(source); + handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + parserContext.getRegistry().registerBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER, handlerAdapterDef); + parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HTTP_REQUEST_HANDLER_ADAPTER)); + } + } + + public static void registerSimpleControllerHandlerAdapter(ParserContext parserContext, Object source) { + if (!parserContext.getRegistry().containsBeanDefinition(VIEW_CONTROLLER_HANDLER_ADAPTER)) { + RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); + handlerAdapterDef.setSource(source); + handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + parserContext.getRegistry().registerBeanDefinition(VIEW_CONTROLLER_HANDLER_ADAPTER, handlerAdapterDef); + parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, VIEW_CONTROLLER_HANDLER_ADAPTER)); + } + } + +} diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java index 03654ab9e5b..e24f708f849 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/config/ResourcesBeanDefinitionParser.java @@ -36,31 +36,27 @@ import org.springframework.web.servlet.resource.ResourceHttpRequestHandler; * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} that parses a * {@code resources} element to register a {@link ResourceHttpRequestHandler}. * Will also register a {@link SimpleUrlHandlerMapping} for mapping resource requests, - * and a {@link HttpRequestHandlerAdapter} if necessary. + * and a {@link HttpRequestHandlerAdapter}. * * @author Keith Donald * @author Jeremy Grelle * @since 3.0.4 */ -class ResourcesBeanDefinitionParser extends AbstractHttpRequestHandlerBeanDefinitionParser implements BeanDefinitionParser { +class ResourcesBeanDefinitionParser implements BeanDefinitionParser { - @Override - public void doParse(Element element, ParserContext parserContext) { + public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); - registerResourceMappings(parserContext, element, source); - } - - private void registerResourceMappings(ParserContext parserContext, Element element, Object source) { + String resourceHandlerName = registerResourceHandler(parserContext, element, source); if (resourceHandlerName == null) { - return; + return null; } Map urlMap = new ManagedMap(); String resourceRequestPath = element.getAttribute("mapping"); if (!StringUtils.hasText(resourceRequestPath)) { parserContext.getReaderContext().error("The 'mapping' attribute is required.", parserContext.extractSource(element)); - return; + return null; } urlMap.put(resourceRequestPath, resourceHandlerName); @@ -76,6 +72,14 @@ class ResourcesBeanDefinitionParser extends AbstractHttpRequestHandlerBeanDefini String beanName = parserContext.getReaderContext().generateBeanName(handlerMappingDef); parserContext.getRegistry().registerBeanDefinition(beanName, handlerMappingDef); parserContext.registerComponent(new BeanComponentDefinition(handlerMappingDef, beanName)); + + // Ensure BeanNameUrlHandlerMapping is not "turned off" (SPR-8289) + MvcNamespaceUtils.registerBeanNameUrlHandlerMapping(parserContext, source); + + // Register HttpRequestHandlerAdapter + MvcNamespaceUtils.registerDefaultHandlerAdapters(parserContext, source); + + return null; } private String registerResourceHandler(ParserContext parserContext, Element element, Object source) { 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 36b985e99c3..12432e92162 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 @@ -18,8 +18,6 @@ package org.springframework.web.servlet.config; import java.util.Map; -import org.w3c.dom.Element; - import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.support.ManagedMap; @@ -28,7 +26,7 @@ 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 @@ -41,9 +39,6 @@ import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter; */ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { - private static final String HANDLER_ADAPTER_BEAN_NAME = - "org.springframework.web.servlet.config.viewControllerHandlerAdapter"; - private static final String HANDLER_MAPPING_BEAN_NAME = "org.springframework.web.servlet.config.viewControllerHandlerMapping"; @@ -51,12 +46,15 @@ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { public BeanDefinition parse(Element element, ParserContext parserContext) { Object source = parserContext.extractSource(element); - // Register handler adapter - registerHanderAdapter(parserContext, source); - - // Register handler mapping + // Register SimpleUrlHandlerMapping for view controllers BeanDefinition handlerMappingDef = registerHandlerMapping(parserContext, source); + // Ensure BeanNameUrlHandlerMapping is not "turned off" (SPR-8289) + MvcNamespaceUtils.registerBeanNameUrlHandlerMapping(parserContext, source); + + // Register SimpleControllerHandlerAdapter + MvcNamespaceUtils.registerDefaultHandlerAdapters(parserContext, source); + // Create view controller bean definition RootBeanDefinition viewControllerDef = new RootBeanDefinition(ParameterizableViewController.class); viewControllerDef.setSource(source); @@ -72,19 +70,10 @@ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { handlerMappingDef.getPropertyValues().add("urlMap", urlMap); } urlMap.put(element.getAttribute("path"), viewControllerDef); + return null; } - private void registerHanderAdapter(ParserContext parserContext, Object source) { - if (!parserContext.getRegistry().containsBeanDefinition(HANDLER_ADAPTER_BEAN_NAME)) { - RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class); - handlerAdapterDef.setSource(source); - handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); - parserContext.getRegistry().registerBeanDefinition(HANDLER_ADAPTER_BEAN_NAME, handlerAdapterDef); - parserContext.registerComponent(new BeanComponentDefinition(handlerAdapterDef, HANDLER_ADAPTER_BEAN_NAME)); - } - } - private BeanDefinition registerHandlerMapping(ParserContext parserContext, Object source) { if (!parserContext.getRegistry().containsBeanDefinition(HANDLER_MAPPING_BEAN_NAME)) { RootBeanDefinition handlerMappingDef = new RootBeanDefinition(SimpleUrlHandlerMapping.class); @@ -98,6 +87,7 @@ class ViewControllerBeanDefinitionParser implements BeanDefinitionParser { else { return parserContext.getRegistry().getBeanDefinition(HANDLER_MAPPING_BEAN_NAME); } + } } diff --git a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java index fe01e9887fd..904a3fd2bdd 100644 --- a/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java +++ b/org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java @@ -332,7 +332,7 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i } } - public void afterPropertiesSet() throws Exception { + public void afterPropertiesSet() { initArgumentResolvers(); initReturnValueHandlers(); initInitBinderArgumentResolvers(); diff --git a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java index 076cf6011eb..72531cfa53e 100644 --- a/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java +++ b/org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java @@ -39,6 +39,7 @@ import org.springframework.web.context.support.GenericWebApplicationContext; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; import org.springframework.web.servlet.mvc.method.annotation.support.ServletWebArgumentResolverAdapter; @@ -111,10 +112,18 @@ public class AnnotationDrivenBeanDefinitionParserTests { assertEquals(TestHandlerMethodReturnValueHandler.class, handlers.get(0).getClass()); } + @Test + public void beanNameUrlHandlerMapping() { + loadBeanDefinitions("mvc-config.xml"); + BeanNameUrlHandlerMapping mapping = appContext.getBean(BeanNameUrlHandlerMapping.class); + assertNotNull(mapping); + assertEquals(2, mapping.getOrder()); + } + private void loadBeanDefinitions(String fileName) { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource(fileName, - AnnotationDrivenBeanDefinitionParserTests.class)); + ClassPathResource resource = new ClassPathResource(fileName, AnnotationDrivenBeanDefinitionParserTests.class); + reader.loadBeanDefinitions(resource); appContext.refresh(); } @@ -133,7 +142,7 @@ public class AnnotationDrivenBeanDefinitionParserTests { assertTrue(converters.get(0) instanceof StringHttpMessageConverter); assertTrue(converters.get(1) instanceof ResourceHttpMessageConverter); } - + } class TestWebArgumentResolver implements WebArgumentResolver { 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 6bb5e804ee9..da551a309e6 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 @@ -61,6 +61,7 @@ import org.springframework.web.method.support.InvocableHandlerMethod; import org.springframework.web.servlet.HandlerExecutionChain; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; import org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter; @@ -99,10 +100,7 @@ public class MvcNamespaceTests { @Test public void testDefaultConfig() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config.xml", getClass())); - assertEquals(8, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config.xml", 11); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); @@ -138,10 +136,7 @@ public class MvcNamespaceTests { @Test(expected=TypeMismatchException.class) public void testCustomConversionService() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-custom-conversion-service.xml", getClass())); - assertEquals(8, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-custom-conversion-service.xml", 11); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); @@ -167,10 +162,7 @@ public class MvcNamespaceTests { @Test public void testCustomValidator() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-custom-validator.xml", getClass())); - assertEquals(8, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-custom-validator.xml", 11); RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); assertNotNull(adapter); @@ -187,10 +179,7 @@ public class MvcNamespaceTests { @Test public void testInterceptors() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-interceptors.xml", getClass())); - assertEquals(11, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-interceptors.xml", 14); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); @@ -220,10 +209,7 @@ public class MvcNamespaceTests { @Test public void testResources() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-resources.xml", getClass())); - assertEquals(3, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-resources.xml", 5); HttpRequestHandlerAdapter adapter = appContext.getBean(HttpRequestHandlerAdapter.class); assertNotNull(adapter); @@ -235,6 +221,10 @@ public class MvcNamespaceTests { assertNotNull(mapping); assertEquals(Ordered.LOWEST_PRECEDENCE - 1, mapping.getOrder()); + BeanNameUrlHandlerMapping beanNameMapping = appContext.getBean(BeanNameUrlHandlerMapping.class); + assertNotNull(beanNameMapping); + assertEquals(2, beanNameMapping.getOrder()); + MockHttpServletRequest request = new MockHttpServletRequest(); request.setRequestURI("/resources/foo.css"); request.setMethod("GET"); @@ -252,10 +242,7 @@ public class MvcNamespaceTests { @Test public void testResourcesWithOptionalAttributes() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-resources-optional-attrs.xml", getClass())); - assertEquals(3, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-resources-optional-attrs.xml", 5); SimpleUrlHandlerMapping mapping = appContext.getBean(SimpleUrlHandlerMapping.class); assertNotNull(mapping); @@ -264,10 +251,7 @@ public class MvcNamespaceTests { @Test public void testDefaultServletHandler() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-default-servlet.xml", getClass())); - assertEquals(3, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-default-servlet.xml", 5); HttpRequestHandlerAdapter adapter = appContext.getBean(HttpRequestHandlerAdapter.class); assertNotNull(adapter); @@ -293,10 +277,7 @@ public class MvcNamespaceTests { @Test public void testDefaultServletHandlerWithOptionalAttributes() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-default-servlet-optional-attrs.xml", getClass())); - assertEquals(3, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-default-servlet-optional-attrs.xml", 5); HttpRequestHandlerAdapter adapter = appContext.getBean(HttpRequestHandlerAdapter.class); assertNotNull(adapter); @@ -322,10 +303,7 @@ public class MvcNamespaceTests { @Test public void testBeanDecoration() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-bean-decoration.xml", getClass())); - assertEquals(10, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-bean-decoration.xml", 13); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); @@ -346,15 +324,16 @@ public class MvcNamespaceTests { @Test public void testViewControllers() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-view-controllers.xml", getClass())); - assertEquals(12, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-view-controllers.xml", 14); RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class); assertNotNull(mapping); mapping.setDefaultHandler(handlerMethod); + BeanNameUrlHandlerMapping beanNameMapping = appContext.getBean(BeanNameUrlHandlerMapping.class); + assertNotNull(beanNameMapping); + assertEquals(2, beanNameMapping.getOrder()); + MockHttpServletRequest request = new MockHttpServletRequest(); request.setMethod("GET"); @@ -405,10 +384,7 @@ public class MvcNamespaceTests { /** WebSphere gives trailing servlet path slashes by default!! */ @Test public void testViewControllersOnWebSphere() throws Exception { - XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); - reader.loadBeanDefinitions(new ClassPathResource("mvc-config-view-controllers.xml", getClass())); - assertEquals(12, appContext.getBeanDefinitionCount()); - appContext.refresh(); + loadBeanDefinitions("mvc-config-view-controllers.xml", 14); SimpleUrlHandlerMapping mapping2 = appContext.getBean(SimpleUrlHandlerMapping.class); SimpleControllerHandlerAdapter adapter = appContext.getBean(SimpleControllerHandlerAdapter.class); @@ -450,6 +426,22 @@ public class MvcNamespaceTests { assertEquals("root", mv3.getViewName()); } + @Test + public void testViewControllersDefaultConfig() { + loadBeanDefinitions("mvc-config-view-controllers-minimal.xml", 4); + + BeanNameUrlHandlerMapping beanNameMapping = appContext.getBean(BeanNameUrlHandlerMapping.class); + assertNotNull(beanNameMapping); + assertEquals(2, beanNameMapping.getOrder()); + } + + private void loadBeanDefinitions(String fileName, int expectedBeanCount) { + XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(appContext); + ClassPathResource resource = new ClassPathResource(fileName, AnnotationDrivenBeanDefinitionParserTests.class); + reader.loadBeanDefinitions(resource); + assertEquals(expectedBeanCount, appContext.getBeanDefinitionCount()); + appContext.refresh(); + } @Controller public static class TestController { diff --git a/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers-minimal.xml b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers-minimal.xml new file mode 100644 index 00000000000..db5627e0699 --- /dev/null +++ b/org.springframework.web.servlet/src/test/resources/org/springframework/web/servlet/config/mvc-config-view-controllers-minimal.xml @@ -0,0 +1,10 @@ + + + + + +