Skip to content

Commit f84a0c9

Browse files
committed
Detect custom ContentNegotiationViewResolver
The <mvc:annotation-driven> element now adds an alias when a ContentNegotiationManager bean is registered with a custom name. This helps <mvc:view-resolvers> to more reliably find such a custom ContentNegotiationManager. Issue: SPR-13559
1 parent 3e807c2 commit f84a0c9

File tree

5 files changed

+31
-10
lines changed

5 files changed

+31
-10
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/config/AnnotationDrivenBeanDefinitionParser.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2014 the original author or authors.
2+
* Copyright 2002-2015 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -364,18 +364,22 @@ else if (javaxValidationPresent) {
364364
private RuntimeBeanReference getContentNegotiationManager(Element element, Object source, ParserContext parserContext) {
365365
RuntimeBeanReference contentNegotiationManagerRef;
366366
if (element.hasAttribute("content-negotiation-manager")) {
367-
contentNegotiationManagerRef = new RuntimeBeanReference(element.getAttribute("content-negotiation-manager"));
367+
String name = element.getAttribute("content-negotiation-manager");
368+
contentNegotiationManagerRef = new RuntimeBeanReference(name);
369+
if (!CONTENT_NEGOTIATION_MANAGER_BEAN_NAME.equals(name)) {
370+
parserContext.getRegistry().registerAlias(name, CONTENT_NEGOTIATION_MANAGER_BEAN_NAME);
371+
}
368372
}
369373
else {
370374
RootBeanDefinition factoryBeanDef = new RootBeanDefinition(ContentNegotiationManagerFactoryBean.class);
371375
factoryBeanDef.setSource(source);
372376
factoryBeanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
373377
factoryBeanDef.getPropertyValues().add("mediaTypes", getDefaultMediaTypes());
374378

375-
String beanName = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
376-
parserContext.getReaderContext().getRegistry().registerBeanDefinition(beanName , factoryBeanDef);
377-
parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, beanName));
378-
contentNegotiationManagerRef = new RuntimeBeanReference(beanName);
379+
String name = CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
380+
parserContext.getReaderContext().getRegistry().registerBeanDefinition(name , factoryBeanDef);
381+
parserContext.registerComponent(new BeanComponentDefinition(factoryBeanDef, name));
382+
contentNegotiationManagerRef = new RuntimeBeanReference(name);
379383
}
380384
return contentNegotiationManagerRef;
381385
}

spring-webmvc/src/main/java/org/springframework/web/servlet/config/ViewResolversBeanDefinitionParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,9 @@ private BeanDefinition createContentNegotiatingViewResolver(Element resolverElem
192192
if (resolverElement.hasAttribute("use-not-acceptable")) {
193193
values.add("useNotAcceptableStatusCode", resolverElement.getAttribute("use-not-acceptable"));
194194
}
195-
String beanName = AnnotationDrivenBeanDefinitionParser.CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
196-
if (context.getRegistry().containsBeanDefinition(beanName)) {
197-
values.add("contentNegotiationManager", new RuntimeBeanReference(beanName));
195+
String name = AnnotationDrivenBeanDefinitionParser.CONTENT_NEGOTIATION_MANAGER_BEAN_NAME;
196+
if (context.getRegistry().containsBeanDefinition(name) || context.getRegistry().isAlias(name)) {
197+
values.add("contentNegotiationManager", new RuntimeBeanReference(name));
198198
}
199199
return beanDef;
200200
}

spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ public void setContentNegotiationManager(ContentNegotiationManager contentNegoti
119119
this.contentNegotiationManager = contentNegotiationManager;
120120
}
121121

122+
public ContentNegotiationManager getContentNegotiationManager() {
123+
return this.contentNegotiationManager;
124+
}
125+
122126
/**
123127
* Indicate whether a {@link HttpServletResponse#SC_NOT_ACCEPTABLE 406 Not Acceptable}
124128
* status code should be returned if no suitable view can be found.

spring-webmvc/src/test/java/org/springframework/web/servlet/config/MvcNamespaceTests.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,14 +691,23 @@ public void testViewControllersDefaultConfig() {
691691

692692
@Test
693693
public void testContentNegotiationManager() throws Exception {
694-
loadBeanDefinitions("mvc-config-content-negotiation-manager.xml", 14);
694+
loadBeanDefinitions("mvc-config-content-negotiation-manager.xml", 15);
695695

696696
RequestMappingHandlerMapping mapping = appContext.getBean(RequestMappingHandlerMapping.class);
697697
ContentNegotiationManager manager = mapping.getContentNegotiationManager();
698698

699699
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo.xml");
700700
NativeWebRequest webRequest = new ServletWebRequest(request);
701701
assertEquals(Arrays.asList(MediaType.valueOf("application/rss+xml")), manager.resolveMediaTypes(webRequest));
702+
703+
ViewResolverComposite compositeResolver = this.appContext.getBean(ViewResolverComposite.class);
704+
assertNotNull(compositeResolver);
705+
assertEquals("Actual: " + compositeResolver.getViewResolvers(), 1, compositeResolver.getViewResolvers().size());
706+
707+
ViewResolver resolver = compositeResolver.getViewResolvers().get(0);
708+
assertEquals(ContentNegotiatingViewResolver.class, resolver.getClass());
709+
ContentNegotiatingViewResolver cnvr = (ContentNegotiatingViewResolver) resolver;
710+
assertSame(manager, cnvr.getContentNegotiationManager());
702711
}
703712

704713
@Test

spring-webmvc/src/test/resources/org/springframework/web/servlet/config/mvc-config-content-negotiation-manager.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99

1010
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
1111

12+
<mvc:view-resolvers>
13+
<mvc:content-negotiation/>
14+
</mvc:view-resolvers>
15+
1216
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
1317
<property name="mediaTypes">
1418
<value>

0 commit comments

Comments
 (0)