Add order attribute to MVC ViewResolver config

The ViewResolverComposite that contains the ViewResolver's registered
throug the MVC Java config and namespace can now be assigned an
explicit order.
This commit is contained in:
Rossen Stoyanchev
2014-09-30 10:36:39 -04:00
parent 3b1d3257d5
commit 77bbfb6e7e
6 changed files with 84 additions and 3 deletions

View File

@@ -133,7 +133,6 @@ public class ViewResolversBeanDefinitionParser implements BeanDefinitionParser {
beanDef.getPropertyValues().add("viewResolvers", resolvers);
ManagedList<Object> list = new ManagedList<Object>(1);
list.add(beanDef);
compositeResolverBeanDef.getPropertyValues().add("order", Ordered.HIGHEST_PRECEDENCE);
compositeResolverBeanDef.getPropertyValues().add("viewResolvers", list);
}
@@ -141,6 +140,10 @@ public class ViewResolversBeanDefinitionParser implements BeanDefinitionParser {
throw new IllegalArgumentException("Only one <content-negotiation> element is allowed.");
}
if (element.hasAttribute("order")) {
compositeResolverBeanDef.getPropertyValues().add("order", element.getAttribute("order"));
}
context.getReaderContext().getRegistry().registerBeanDefinition(beanName, compositeResolverBeanDef);
context.registerComponent(new BeanComponentDefinition(compositeResolverBeanDef, beanName));
context.popAndRegisterContainingComponent();

View File

@@ -57,7 +57,7 @@ public class ViewResolverRegistry {
private final List<ViewResolver> viewResolvers = new ArrayList<ViewResolver>(4);
private int order = Ordered.LOWEST_PRECEDENCE;
private Integer order;
private ContentNegotiationManager contentNegotiationManager;
@@ -112,7 +112,7 @@ public class ViewResolverRegistry {
private void initContentNegotiatingViewResolver(View[] defaultViews) {
// ContentNegotiatingResolver in the registry: elevate its precedence!
this.order = Ordered.HIGHEST_PRECEDENCE;
this.order = (this.order == null ? Ordered.HIGHEST_PRECEDENCE : this.order);
if (this.contentNegotiatingResolver != null) {
if (!ObjectUtils.isEmpty(defaultViews)) {
@@ -257,6 +257,22 @@ public class ViewResolverRegistry {
this.viewResolvers.add(viewResolver);
}
/**
* ViewResolver's registered through this registry are encapsulated in an
* instance of {@link org.springframework.web.servlet.view.ViewResolverComposite
* ViewResolverComposite} and follow the order of registration.
* This property determines the order of the ViewResolverComposite itself
* relative to any additional ViewResolver's (not registered here) present in
* the Spring configuration
* <p>By default this property is not set, which means the resolver is ordered
* at {@link Ordered#LOWEST_PRECEDENCE} unless content negotiation is enabled
* in which case the order (if not set explicitly) is changed to
* {@link Ordered#HIGHEST_PRECEDENCE}.
*/
public void order(int order) {
this.order = order;
}
protected boolean hasBeanOfType(Class<?> beanType) {
return !ObjectUtils.isEmpty(BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
this.applicationContext, beanType, false, false));