Fix issue with @EnableWebMvc + existing ViewResolver
Issue: SPR-12013
This commit is contained in:
committed by
Rossen Stoyanchev
parent
e41b14449e
commit
9092102a83
@@ -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}.
|
||||
*
|
||||
* <p>An {@code InternalResourceViewResolver} is added by default if no other
|
||||
* resolvers are configured.
|
||||
* <p>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<ViewResolver> 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;
|
||||
|
||||
@@ -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("<html><body>Hello World!</body></html>",
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<ViewResolver> 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
|
||||
|
||||
Reference in New Issue
Block a user