diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java index aa69d0d9b2..fa26e45a0e 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java @@ -471,21 +471,34 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { private ManagedList getArgumentResolvers(Element element, ParserContext parserContext) { Element resolversElement = DomUtils.getChildElementByTagName(element, "argument-resolvers"); if (resolversElement != null) { - ManagedList argumentResolvers = extractBeanSubElements(resolversElement, parserContext); - ManagedList customAndReferencedResolvers = new ManagedList(); - customAndReferencedResolvers.addAll(wrapWebArgumentResolverBeanDefs(argumentResolvers, parserContext)); - customAndReferencedResolvers.addAll(extractBeanRefSubElements(resolversElement, parserContext)); - return customAndReferencedResolvers; + ManagedList resolvers = extractBeanSubElements(resolversElement, parserContext); + return wrapLegacyResolvers(resolvers, parserContext); } return null; } - private ManagedList getReturnValueHandlers(Element element, ParserContext parserContext) { - Element handlersElement = DomUtils.getChildElementByTagName(element, "return-value-handlers"); - if (handlersElement != null) { - return extractBeanSubElements(handlersElement, parserContext); + private ManagedList wrapLegacyResolvers(List list, ParserContext context) { + ManagedList result = new ManagedList(); + for (Object object : list) { + if (object instanceof BeanDefinitionHolder) { + BeanDefinitionHolder beanDef = (BeanDefinitionHolder) object; + String className = beanDef.getBeanDefinition().getBeanClassName(); + Class clazz = ClassUtils.resolveClassName(className, context.getReaderContext().getBeanClassLoader()); + if (WebArgumentResolver.class.isAssignableFrom(clazz)) { + RootBeanDefinition adapter = new RootBeanDefinition(ServletWebArgumentResolverAdapter.class); + adapter.getConstructorArgumentValues().addIndexedArgumentValue(0, beanDef); + result.add(new BeanDefinitionHolder(adapter, beanDef.getBeanName() + "Adapter")); + continue; + } + } + result.add(object); } - return null; + return result; + } + + private ManagedList getReturnValueHandlers(Element element, ParserContext parserContext) { + Element handlers = DomUtils.getChildElementByTagName(element, "return-value-handlers"); + return (handlers != null ? extractBeanSubElements(handlers, parserContext) : null); } private ManagedList getMessageConverters(Element element, Object source, ParserContext parserContext) { @@ -536,13 +549,12 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { } - private ManagedList extractBeanSubElements(Element parentElement, ParserContext parserContext) { - ManagedList list = new ManagedList(); + private ManagedList extractBeanSubElements(Element parentElement, ParserContext parserContext) { + ManagedList list = new ManagedList(); list.setSource(parserContext.extractSource(parentElement)); - for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean")) { - BeanDefinitionHolder beanDef = parserContext.getDelegate().parseBeanDefinitionElement(beanElement); - beanDef = parserContext.getDelegate().decorateBeanDefinitionIfRequired(beanElement, beanDef); - list.add(beanDef); + for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) { + Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null); + list.add(object); } return list; } @@ -566,25 +578,6 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser { return list; } - private ManagedList wrapWebArgumentResolverBeanDefs( - List beanDefs, ParserContext parserContext) { - - ManagedList result = new ManagedList(); - for (BeanDefinitionHolder beanDef : beanDefs) { - String className = beanDef.getBeanDefinition().getBeanClassName(); - Class clazz = ClassUtils.resolveClassName(className, parserContext.getReaderContext().getBeanClassLoader()); - if (WebArgumentResolver.class.isAssignableFrom(clazz)) { - RootBeanDefinition adapter = new RootBeanDefinition(ServletWebArgumentResolverAdapter.class); - adapter.getConstructorArgumentValues().addIndexedArgumentValue(0, beanDef); - result.add(new BeanDefinitionHolder(adapter, beanDef.getBeanName() + "Adapter")); - } - else { - result.add(beanDef); - } - } - return result; - } - /** * A FactoryBean for a CompositeUriComponentsContributor that obtains the diff --git a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd index 546dced134..a12832ed22 100644 --- a/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd +++ b/spring-webmvc/src/main/resources/org/springframework/web/servlet/config/spring-mvc-4.1.xsd @@ -138,8 +138,7 @@ @@ -160,15 +159,27 @@ ]]> - - + + - + + + + + + + + + + + diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java index 3f435f8b3d..b0bd56aa60 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParserTests.java @@ -117,26 +117,13 @@ public class AnnotationDrivenBeanDefinitionParserTests { assertNotNull(value); assertTrue(value instanceof List); List resolvers = (List) value; - assertEquals(2, resolvers.size()); + assertEquals(3, resolvers.size()); assertTrue(resolvers.get(0) instanceof ServletWebArgumentResolverAdapter); assertTrue(resolvers.get(1) instanceof TestHandlerMethodArgumentResolver); + assertTrue(resolvers.get(2) instanceof TestHandlerMethodArgumentResolver); + assertNotSame(resolvers.get(1), resolvers.get(2)); } - @SuppressWarnings("unchecked") - @Test - public void testArgumentResolversWithReference() { - loadBeanDefinitions("mvc-config-argument-resolvers-references.xml"); - RequestMappingHandlerAdapter adapter = appContext.getBean(RequestMappingHandlerAdapter.class); - assertNotNull(adapter); - Object value = new DirectFieldAccessor(adapter).getPropertyValue("customArgumentResolvers"); - assertNotNull(value); - assertTrue(value instanceof List); - List resolvers = (List) value; - assertEquals(2, resolvers.size()); - assertTrue(resolvers.get(0) instanceof ServletWebArgumentResolverAdapter); - assertTrue(resolvers.get(1) instanceof TestHandlerMethodArgumentResolver); - } - @SuppressWarnings("unchecked") @Test public void testReturnValueHandlers() { @@ -147,8 +134,10 @@ public class AnnotationDrivenBeanDefinitionParserTests { assertNotNull(value); assertTrue(value instanceof List); List handlers = (List) value; - assertEquals(1, handlers.size()); + assertEquals(2, handlers.size()); assertEquals(TestHandlerMethodReturnValueHandler.class, handlers.get(0).getClass()); + assertEquals(TestHandlerMethodReturnValueHandler.class, handlers.get(1).getClass()); + assertNotSame(handlers.get(0), handlers.get(1)); } @Test diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-argument-resolvers-references.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-argument-resolvers-references.xml deleted file mode 100644 index 4a409d9690..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-argument-resolvers-references.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-argument-resolvers.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-argument-resolvers.xml index 084771e12c..64d7f3e874 100644 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-argument-resolvers.xml +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-argument-resolvers.xml @@ -9,7 +9,10 @@ + + + diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml index 78e0d64e1f..b43f44de5b 100644 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-return-value-handlers.xml @@ -1,6 +1,6 @@ @@ -8,7 +8,10 @@ + + +