Skip to content

Commit 9092102

Browse files
sdeleuzerstoyanchev
authored andcommitted
Fix issue with @EnableWebMvc + existing ViewResolver
Issue: SPR-12013
1 parent e41b144 commit 9092102

File tree

3 files changed

+39
-15
lines changed

3 files changed

+39
-15
lines changed

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

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.ArrayList;
2020
import java.util.HashMap;
2121
import java.util.List;
22+
import java.util.Locale;
2223
import java.util.Map;
2324
import javax.servlet.ServletContext;
2425
import javax.servlet.http.HttpServletRequest;
@@ -81,7 +82,6 @@
8182
import org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver;
8283
import org.springframework.web.servlet.resource.ResourceUrlProvider;
8384
import org.springframework.web.servlet.resource.ResourceUrlProviderExposingInterceptor;
84-
import org.springframework.web.servlet.view.InternalResourceViewResolver;
8585
import org.springframework.web.servlet.view.ViewResolverComposite;
8686
import org.springframework.web.util.UrlPathHelper;
8787

@@ -773,15 +773,16 @@ protected final void addDefaultHandlerExceptionResolvers(List<HandlerExceptionRe
773773
}
774774

775775
/**
776-
* Register a {@link org.springframework.web.servlet.view.ViewResolverComposite}
777-
* that contains a chain of view resolvers to use for view resolution.
776+
* Register a {@link ViewResolverComposite} that contains a chain of view resolvers
777+
* to use for view resolution.
778778
* By default this resolver is ordered at 0 unless content negotiation view
779779
* resolution is used in which case the order is raised to
780780
* {@link org.springframework.core.Ordered#HIGHEST_PRECEDENCE
781781
* Ordered.HIGHEST_PRECEDENCE}.
782782
*
783-
* <p>An {@code InternalResourceViewResolver} is added by default if no other
784-
* resolvers are configured.
783+
* <p>If no other resolvers are configured,
784+
* {@link ViewResolverComposite#resolveViewName(String, Locale)} returns null in order
785+
* to allow other potential {@link ViewResolver} beans to resolve views.
785786
*
786787
* @since 4.1
787788
*/
@@ -792,14 +793,9 @@ public ViewResolver mvcViewResolver() {
792793
registry.setApplicationContext(this.applicationContext);
793794
configureViewResolvers(registry);
794795

795-
List<ViewResolver> viewResolvers = registry.getViewResolvers();
796-
if (viewResolvers.isEmpty()) {
797-
viewResolvers.add(new InternalResourceViewResolver());
798-
}
799-
800796
ViewResolverComposite composite = new ViewResolverComposite();
801797
composite.setOrder(registry.getOrder());
802-
composite.setViewResolvers(viewResolvers);
798+
composite.setViewResolvers(registry.getViewResolvers());
803799
composite.setApplicationContext(this.applicationContext);
804800
composite.setServletContext(this.servletContext);
805801
return composite;

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
3333
import org.springframework.web.servlet.DispatcherServlet;
3434
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
35+
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
3536
import org.springframework.web.servlet.view.groovy.GroovyMarkupConfigurer;
3637
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
3738
import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
@@ -101,6 +102,15 @@ public void groovyMarkupInvalidConfig() throws Exception {
101102
runTest(InvalidGroovyMarkupWebConfig.class);
102103
}
103104

105+
// SPR-12013
106+
107+
@Test
108+
public void viewResolverBeanWithDefaultViewResolutionConfig() throws Exception {
109+
MockHttpServletResponse response = runTest(FreeMarkerBeanBasedWebConfig.class);
110+
assertEquals("<html><body>Hello World!</body></html>",
111+
response.getContentAsString());
112+
}
113+
104114

105115
private MockHttpServletResponse runTest(Class<?> configClass) throws ServletException, IOException {
106116
String basePath = "org/springframework/web/servlet/config/annotation";
@@ -239,4 +249,22 @@ public void configureViewResolvers(ViewResolverRegistry registry) {
239249
}
240250
}
241251

252+
@Configuration
253+
static class FreeMarkerBeanBasedWebConfig extends AbstractWebConfig {
254+
255+
@Bean
256+
public FreeMarkerViewResolver freeMarkerViewResolver() {
257+
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
258+
viewResolver.setSuffix(".ftl");
259+
return viewResolver;
260+
}
261+
262+
@Bean
263+
public FreeMarkerConfigurer freeMarkerConfigurer() {
264+
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
265+
configurer.setTemplateLoaderPath("/WEB-INF/");
266+
return configurer;
267+
}
268+
}
269+
242270
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.web.servlet.config.annotation;
1818

1919
import java.util.List;
20+
import java.util.Locale;
2021
import javax.servlet.http.HttpServletRequest;
2122

2223
import org.joda.time.DateTime;
@@ -49,7 +50,6 @@
4950
import org.springframework.web.servlet.HandlerExceptionResolver;
5051
import org.springframework.web.servlet.HandlerExecutionChain;
5152
import org.springframework.web.servlet.ViewResolver;
52-
import org.springframework.web.servlet.view.InternalResourceViewResolver;
5353
import org.springframework.web.servlet.view.ViewResolverComposite;
5454
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
5555
import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;
@@ -205,12 +205,12 @@ public void handlerExceptionResolver() throws Exception {
205205
}
206206

207207
@Test
208-
public void viewResolvers() throws Exception {
208+
public void emptyViewResolver() throws Exception {
209209
ViewResolverComposite compositeResolver = this.wac.getBean(ViewResolverComposite.class);
210210
assertEquals(Ordered.LOWEST_PRECEDENCE, compositeResolver.getOrder());
211211
List<ViewResolver> resolvers = compositeResolver.getViewResolvers();
212-
assertEquals(1, resolvers.size());
213-
assertEquals(InternalResourceViewResolver.class, resolvers.get(0).getClass());
212+
assertEquals(0, resolvers.size());
213+
assertNull(compositeResolver.resolveViewName("anyViewName", Locale.ENGLISH));
214214
}
215215

216216
@Test

0 commit comments

Comments
 (0)