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