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 588a64c3e6554fa29a2c67623b2c625b96008ae0..3d60cea0865cc1dda3ef9e5271cbad2f621c8361 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
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2014 the original author or authors.
+ * Copyright 2002-2015 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.
@@ -352,7 +352,11 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
private RuntimeBeanReference getContentNegotiationManager(Element element, Object source, ParserContext parserContext) {
RuntimeBeanReference contentNegotiationManagerRef;
if (element.hasAttribute("content-negotiation-manager")) {
- contentNegotiationManagerRef = new RuntimeBeanReference(element.getAttribute("content-negotiation-manager"));
+ String name = element.getAttribute("content-negotiation-manager");
+ contentNegotiationManagerRef = new RuntimeBeanReference(name);
+ if (!CONTENT_NEGOTIATION_MANAGER_BEAN_NAME.equals(name)) {
+ parserContext.getRegistry().registerAlias(name, CONTENT_NEGOTIATION_MANAGER_BEAN_NAME);
+ }
}
else {
RootBeanDefinition factoryBeanDef = new RootBeanDefinition(ContentNegotiationManagerFactoryBean.class);
@@ -360,10 +364,10 @@ class AnnotationDrivenBeanDefinitionParser implements BeanDefinitionParser {
factoryBeanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
factoryBeanDef.getPropertyValues().add("mediaTypes", getDefaultMediaTypes());
- String beanName = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
- parserContext.getReaderContext().getRegistry().registerBeanDefinition(beanName , factoryBeanDef);
- parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, beanName));
- contentNegotiationManagerRef = new RuntimeBeanReference(beanName);
+ String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
+ parserContext.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef);
+ parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, name));
+ contentNegotiationManagerRef = new RuntimeBeanReference(name);
}
return contentNegotiationManagerRef;
}
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java
index 37ce259f926f746effe8d6b163abeeee3127e310..a048a6aacee40b763fdcf17b965f622c5ccd9253 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java
@@ -185,9 +185,9 @@ public class ViewResolversBeanDefinitionParser implements BeanDefinitionParser {
if (resolverElement.hasAttribute("use-not-acceptable")) {
values.add("useNotAcceptableStatusCode", resolverElement.getAttribute("use-not-acceptable"));
}
- String beanName = AnnotationDrivenBeanDefinitionParser.CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
- if (context.getRegistry().containsBeanDefinition(beanName)) {
- values.add("contentNegotiationManager", new RuntimeBeanReference(beanName));
+ String name = AnnotationDrivenBeanDefinitionParser.CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
+ if (context.getRegistry().containsBeanDefinition(name) || context.getRegistry().isAlias(name)) {
+ values.add("contentNegotiationManager", new RuntimeBeanReference(name));
}
return beanDef;
}
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java
index bfc766aa96ee89a1f22a02216571e8bb6c794ead..97c9d14bc4acccc311c654bf990b80c69d8e6781 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java
@@ -124,6 +124,10 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport
this.contentNegotiationManager = contentNegotiationManager;
}
+ public ContentNegotiationManager getContentNegotiationManager() {
+ return this.contentNegotiationManager;
+ }
+
/**
* Indicate whether the extension of the request path should be used to determine the requested media type,
* in favor of looking at the {@code Accept} header. The default value is {@code true}.
diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java
index 0967961bd50148d3a5a74985a31f695f496a2ef2..c24f2c73e0bc041cae9363dd76e7a3d7b4112ba0 100644
--- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java
+++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java
@@ -680,7 +680,7 @@ public class MvcNamespaceTests {
@Test
public void testContentNegotiationManager() throws Exception {
- loadBeanDefinitions("mvc-config-content-negotiation-manager.xml", 13);
+ loadBeanDefinitions("mvc-config-content-negotiation-manager.xml", 15);
RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class);
ContentNegotiationManager manager = mapping.getContentNegotiationManager();
@@ -688,6 +688,15 @@ public class MvcNamespaceTests {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo.xml");
NativeWebRequest webRequest = new ServletWebRequest(request);
assertEquals(Arrays.asList(MediaType.valueOf("application/rss+xml")), manager.resolveMediaTypes(webRequest));
+
+ ViewResolverComposite compositeResolver = this.appContext.getBean(ViewResolverComposite.class);
+ assertNotNull(compositeResolver);
+ assertEquals("Actual: " + compositeResolver.getViewResolvers(), 1, compositeResolver.getViewResolvers().size());
+
+ ViewResolver resolver = compositeResolver.getViewResolvers().get(0);
+ assertEquals(ContentNegotiatingViewResolver.class, resolver.getClass());
+ ContentNegotiatingViewResolver cnvr = (ContentNegotiatingViewResolver) resolver;
+ assertSame(manager, cnvr.getContentNegotiationManager());
}
@Test
diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml
index 34d609b65cb00c1a188d8d5ce306b00822dd5751..f213de087aec74257c1b372f1c4ed4412230bef2 100644
--- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml
+++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml
@@ -9,6 +9,10 @@
+
+
+
+