From 9092102a832173b2ab40f748ea361413c3250b42 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Tue, 22 Jul 2014 11:46:02 +0200 Subject: [PATCH] Fix issue with @EnableWebMvc + existing ViewResolver Issue: SPR-12013 --- .../WebMvcConfigurationSupport.java | 18 +++++------- .../ViewResolutionIntegrationTests.java | 28 +++++++++++++++++++ .../WebMvcConfigurationSupportTests.java | 8 +++--- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index 1a53e9bb88..05d48330de 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -19,6 +19,7 @@ package org.springframework.web.servlet.config.annotation; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; @@ -81,7 +82,6 @@ import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver; import org.springframework.web.servlet.resource.ResourceUrlProvider; import org.springframework.web.servlet.resource.ResourceUrlProviderExposingInterceptor; -import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.ViewResolverComposite; import org.springframework.web.util.UrlPathHelper; @@ -773,15 +773,16 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv } /** - * Register a {@link org.springframework.web.servlet.view.ViewResolverComposite} - * that contains a chain of view resolvers to use for view resolution. + * Register a {@link ViewResolverComposite} that contains a chain of view resolvers + * to use for view resolution. * By default this resolver is ordered at 0 unless content negotiation view * resolution is used in which case the order is raised to * {@link org.springframework.core.Ordered#HIGHEST_PRECEDENCE * Ordered.HIGHEST_PRECEDENCE}. * - *

An {@code InternalResourceViewResolver} is added by default if no other - * resolvers are configured. + *

If no other resolvers are configured, + * {@link ViewResolverComposite#resolveViewName(String, Locale)} returns null in order + * to allow other potential {@link ViewResolver} beans to resolve views. * * @since 4.1 */ @@ -792,14 +793,9 @@ public class WebMvcConfigurationSupport implements ApplicationContextAware, Serv registry.setApplicationContext(this.applicationContext); configureViewResolvers(registry); - List viewResolvers = registry.getViewResolvers(); - if (viewResolvers.isEmpty()) { - viewResolvers.add(new InternalResourceViewResolver()); - } - ViewResolverComposite composite = new ViewResolverComposite(); composite.setOrder(registry.getOrder()); - composite.setViewResolvers(viewResolvers); + composite.setViewResolvers(registry.getViewResolvers()); composite.setApplicationContext(this.applicationContext); composite.setServletContext(this.servletContext); return composite; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewResolutionIntegrationTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewResolutionIntegrationTests.java index a8763a0ef1..ddb3fff2b6 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewResolutionIntegrationTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/ViewResolutionIntegrationTests.java @@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; +import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; import org.springframework.web.servlet.view.groovy.GroovyMarkupConfigurer; import org.springframework.web.servlet.view.tiles3.TilesConfigurer; import org.springframework.web.servlet.view.velocity.VelocityConfigurer; @@ -101,6 +102,15 @@ public class ViewResolutionIntegrationTests { runTest(InvalidGroovyMarkupWebConfig.class); } + // SPR-12013 + + @Test + public void viewResolverBeanWithDefaultViewResolutionConfig() throws Exception { + MockHttpServletResponse response = runTest(FreeMarkerBeanBasedWebConfig.class); + assertEquals("Hello World!", + response.getContentAsString()); + } + private MockHttpServletResponse runTest(Class configClass) throws ServletException, IOException { String basePath = "org/springframework/web/servlet/config/annotation"; @@ -239,4 +249,22 @@ public class ViewResolutionIntegrationTests { } } + @Configuration + static class FreeMarkerBeanBasedWebConfig extends AbstractWebConfig { + + @Bean + public FreeMarkerViewResolver freeMarkerViewResolver() { + FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver(); + viewResolver.setSuffix(".ftl"); + return viewResolver; + } + + @Bean + public FreeMarkerConfigurer freeMarkerConfigurer() { + FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); + configurer.setTemplateLoaderPath("/WEB-INF/"); + return configurer; + } + } + } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java index b7f8a8f382..114c5138b0 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupportTests.java @@ -17,6 +17,7 @@ package org.springframework.web.servlet.config.annotation; import java.util.List; +import java.util.Locale; import javax.servlet.http.HttpServletRequest; import org.joda.time.DateTime; @@ -49,7 +50,6 @@ import org.springframework.web.method.support.CompositeUriComponentsContributor; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerExecutionChain; import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.ViewResolverComposite; import org.springframework.web.servlet.handler.AbstractHandlerMapping; import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping; @@ -205,12 +205,12 @@ public class WebMvcConfigurationSupportTests { } @Test - public void viewResolvers() throws Exception { + public void emptyViewResolver() throws Exception { ViewResolverComposite compositeResolver = this.wac.getBean(ViewResolverComposite.class); assertEquals(Ordered.LOWEST_PRECEDENCE, compositeResolver.getOrder()); List resolvers = compositeResolver.getViewResolvers(); - assertEquals(1, resolvers.size()); - assertEquals(InternalResourceViewResolver.class, resolvers.get(0).getClass()); + assertEquals(0, resolvers.size()); + assertNull(compositeResolver.resolveViewName("anyViewName", Locale.ENGLISH)); } @Test