Support Java and MVC namespace view resolution config

This commit improves and completes the initial MVC namespace
view resolution implementation. ContentNegotiatingViewResolver
registration is now also supported.

Java Config view resolution support has been added.
FreeMarker, Velocity and Tiles view configurers are registered
depending on the classpath thanks to an ImportSelector.

For both, a default configuration is provided and documented.

Issue: SPR-7093
This commit is contained in:
Sebastien Deleuze
2014-06-19 11:40:14 +02:00
committed by Rossen Stoyanchev
parent a26b1ef8d9
commit cc7e8f5558
34 changed files with 1995 additions and 263 deletions

View File

@@ -51,7 +51,7 @@ import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.validation.annotation.Validated;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.accept.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.NativeWebRequest;
@@ -84,13 +84,13 @@ import org.springframework.web.servlet.resource.ResourceResolver;
import org.springframework.web.servlet.resource.ResourceTransformer;
import org.springframework.web.servlet.theme.ThemeChangeInterceptor;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.web.servlet.view.BeanNameViewResolver;
import org.springframework.web.servlet.view.InternalResourceView;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.*;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
import org.springframework.web.servlet.view.velocity.VelocityViewResolver;
import static org.junit.Assert.*;
@@ -99,6 +99,7 @@ import static org.junit.Assert.*;
* @author Arjen Poutsma
* @author Jeremy Grelle
* @author Brian Clozel
* @author Sebastien Deleuze
*/
public class MvcNamespaceTests {
@@ -556,32 +557,95 @@ public class MvcNamespaceTests {
}
@Test
public void testViewResolvers() throws Exception{
loadBeanDefinitions("mvc-config-view-resolvers.xml", 6);
InternalResourceViewResolver internalResourceViewResolver=appContext.getBean(InternalResourceViewResolver.class);
assertNotNull(internalResourceViewResolver);
InternalResourceView jstlView=(InternalResourceView) internalResourceViewResolver.resolveViewName("xyz", Locale.ENGLISH);
assertEquals(jstlView.getUrl(), "/WEB-INF/xyz.jsp");
BeanNameViewResolver beanNameUrlHandlerMapping=appContext.getBean(BeanNameViewResolver.class);
assertNotNull(beanNameUrlHandlerMapping);
TilesConfigurer tilesConfigurer=appContext.getBean(TilesConfigurer.class);
assertNotNull(tilesConfigurer);
TilesViewResolver tilesViewResolver=appContext.getBean(TilesViewResolver.class);
assertNotNull(tilesViewResolver);
FreeMarkerConfigurer freeMarkerConfigurer=appContext.getBean(FreeMarkerConfigurer.class);
assertNotNull(freeMarkerConfigurer);
FreeMarkerViewResolver freeMarkerViewResolver=appContext.getBean(FreeMarkerViewResolver.class);
assertNotNull(freeMarkerViewResolver);
}
public void testViewResolvers() throws Exception {
loadBeanDefinitions("mvc-config-view-resolution.xml", 8);
InternalResourceViewResolver internalResourceViewResolver = appContext.getBean(InternalResourceViewResolver.class);
assertNotNull(internalResourceViewResolver);
assertEquals(0, internalResourceViewResolver.getOrder());
DirectFieldAccessor internalResourceViewResolverFieldAccessor = new DirectFieldAccessor(internalResourceViewResolver);
assertEquals("/WEB-INF/", internalResourceViewResolverFieldAccessor.getPropertyValue("prefix"));
assertEquals(".jsp", internalResourceViewResolverFieldAccessor.getPropertyValue("suffix"));
BeanNameViewResolver beanNameViewResolver = appContext.getBean(BeanNameViewResolver.class);
assertNotNull(beanNameViewResolver);
assertEquals(1, beanNameViewResolver.getOrder());
TilesConfigurer tilesConfigurer = appContext.getBean(TilesConfigurer.class);
assertNotNull(tilesConfigurer);
DirectFieldAccessor tilesConfigurerFieldAccessor = new DirectFieldAccessor(tilesConfigurer);
assertArrayEquals(new String[]{"/org/springframework/web/servlet/resource/tiles/tiles1.xml","/org/springframework/web/servlet/resource/tiles/tiles2.xml"},
(String[])tilesConfigurerFieldAccessor.getPropertyValue("definitions"));
assertTrue((boolean)tilesConfigurerFieldAccessor.getPropertyValue("checkRefresh"));
TilesViewResolver tilesViewResolver = appContext.getBean(TilesViewResolver.class);
assertNotNull(tilesViewResolver);
assertEquals(2, tilesViewResolver.getOrder());
FreeMarkerConfigurer freeMarkerConfigurer = appContext.getBean(FreeMarkerConfigurer.class);
assertNotNull(freeMarkerConfigurer);
DirectFieldAccessor freeMarkerConfigurerFieldAccessor = new DirectFieldAccessor(freeMarkerConfigurer);
assertArrayEquals(new String[]{"/","/test"},
(String[])freeMarkerConfigurerFieldAccessor.getPropertyValue("templateLoaderPaths"));
FreeMarkerViewResolver freeMarkerViewResolver = appContext.getBean(FreeMarkerViewResolver.class);
assertNotNull(freeMarkerViewResolver);
assertEquals(3, freeMarkerViewResolver.getOrder());
DirectFieldAccessor freeMarkerViewResolverFieldAccessor = new DirectFieldAccessor(freeMarkerViewResolver);
assertEquals("", freeMarkerViewResolverFieldAccessor.getPropertyValue("prefix"));
assertEquals(".ftl", freeMarkerViewResolverFieldAccessor.getPropertyValue("suffix"));
assertEquals(0, freeMarkerViewResolverFieldAccessor.getPropertyValue("cacheLimit"));
VelocityConfigurer velocityConfigurer = appContext.getBean(VelocityConfigurer.class);
assertNotNull(velocityConfigurer);
DirectFieldAccessor velocityConfigurerFieldAccessor = new DirectFieldAccessor(velocityConfigurer);
assertEquals("/", velocityConfigurerFieldAccessor.getPropertyValue("resourceLoaderPath"));
VelocityViewResolver velocityViewResolver = appContext.getBean(VelocityViewResolver.class);
assertNotNull(velocityViewResolver);
assertEquals(4, velocityViewResolver.getOrder());
DirectFieldAccessor velocityViewResolverFieldAccessor = new DirectFieldAccessor(velocityViewResolver);
assertEquals("", velocityViewResolverFieldAccessor.getPropertyValue("prefix"));
assertEquals(".vm", velocityViewResolverFieldAccessor.getPropertyValue("suffix"));
assertEquals(0, velocityViewResolverFieldAccessor.getPropertyValue("cacheLimit"));
}
@Test
public void testContentNegotiating() throws Exception {
loadBeanDefinitions("mvc-config-content-negotiating.xml", 11);
ContentNegotiatingViewResolver contentNegotiatingViewResolver = appContext.getBean(ContentNegotiatingViewResolver.class);
assertNotNull(contentNegotiatingViewResolver);
DirectFieldAccessor contentNegotiatingViewResolverFieldAccessor = new DirectFieldAccessor(contentNegotiatingViewResolver);
assertTrue((boolean)contentNegotiatingViewResolverFieldAccessor.getPropertyValue("useNotAcceptableStatusCode"));
assertEquals(1, ((List<?>)contentNegotiatingViewResolverFieldAccessor.getPropertyValue("defaultViews")).size());
assertEquals(7, ((List<?>)contentNegotiatingViewResolverFieldAccessor.getPropertyValue("viewResolvers")).size());
ContentNegotiationManager contentNegotiationManagerProperty =
(ContentNegotiationManager)contentNegotiatingViewResolverFieldAccessor.getPropertyValue("contentNegotiationManager");
assertNotNull(contentNegotiationManagerProperty);
ContentNegotiationManager contentNegotiationManager = appContext.getBean(ContentNegotiationManager.class);
assertNotNull(contentNegotiationManager);
assertEquals(contentNegotiationManagerProperty.getClass(), contentNegotiationManager.getClass());
}
@Test
public void testContentNegotiatingWithDefaultValues() throws Exception {
loadBeanDefinitions("mvc-config-content-negotiating-with-default-values.xml", 19);
ContentNegotiatingViewResolver contentNegotiatingViewResolver = appContext.getBean(ContentNegotiatingViewResolver.class);
assertNotNull(contentNegotiatingViewResolver);
DirectFieldAccessor contentNegotiatingViewResolverFieldAccessor = new DirectFieldAccessor(contentNegotiatingViewResolver);
assertEquals(1, ((List<?>)contentNegotiatingViewResolverFieldAccessor.getPropertyValue("defaultViews")).size());
assertEquals(3, ((List<?>)contentNegotiatingViewResolverFieldAccessor.getPropertyValue("viewResolvers")).size());
ContentNegotiationManager contentNegotiationManagerProperty =
(ContentNegotiationManager)contentNegotiatingViewResolverFieldAccessor.getPropertyValue("contentNegotiationManager");
assertNotNull(contentNegotiationManagerProperty);
ContentNegotiationManager contentNegotiationManager = appContext.getBean(ContentNegotiationManager.class);
assertNotNull(contentNegotiationManager);
assertEquals(contentNegotiationManagerProperty.getClass(), contentNegotiationManager.getClass());
}
@Test
public void testPathMatchingHandlerMappings() throws Exception {
loadBeanDefinitions("mvc-config-path-matching-mappings.xml", 20);

View File

@@ -0,0 +1,205 @@
/*
* Copyright 2002-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.servlet.config.annotation;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.web.servlet.view.BeanNameViewResolver;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
import org.springframework.web.servlet.view.velocity.VelocityViewResolver;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
/**
* Test fixture with a {@link ViewResolutionRegistry}.
*
* @author Sebastien Deleuze
*/
public class ViewResolutionRegistryTests {
private ViewResolutionRegistry registry;
@Before
public void setUp() {
registry = new ViewResolutionRegistry();
}
@Test
public void noViewResolution() {
assertNotNull(registry.getViewResolvers());
assertEquals(0, registry.getViewResolvers().size());
}
@Test
public void customViewResolution() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/");
viewResolver.setSuffix(".jsp");
registry.addViewResolver(viewResolver);
assertEquals(InternalResourceViewResolver.class, registry.getViewResolvers().get(0).getClass());
InternalResourceViewResolver resolver = (InternalResourceViewResolver)registry.getViewResolvers().get(0);
DirectFieldAccessor resolverDirectFieldAccessor = new DirectFieldAccessor(resolver);
assertEquals("/", resolverDirectFieldAccessor.getPropertyValue("prefix"));
assertEquals(".jsp", resolverDirectFieldAccessor.getPropertyValue("suffix"));
}
@Test
public void beanNameViewResolution() {
registry.beanName();
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(BeanNameViewResolver.class, registry.getViewResolvers().get(0).getClass());
}
@Test
public void jspViewResolution() {
registry.jsp("/", ".jsp");
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(InternalResourceViewResolver.class, registry.getViewResolvers().get(0).getClass());
InternalResourceViewResolver resolver = (InternalResourceViewResolver)registry.getViewResolvers().get(0);
DirectFieldAccessor resolverDirectFieldAccessor = new DirectFieldAccessor(resolver);
assertEquals("/", resolverDirectFieldAccessor.getPropertyValue("prefix"));
assertEquals(".jsp", resolverDirectFieldAccessor.getPropertyValue("suffix"));
}
@Test
public void defaultJspViewResolution() {
registry.jsp();
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(InternalResourceViewResolver.class, registry.getViewResolvers().get(0).getClass());
InternalResourceViewResolver resolver = (InternalResourceViewResolver)registry.getViewResolvers().get(0);
DirectFieldAccessor resolverDirectFieldAccessor = new DirectFieldAccessor(resolver);
assertEquals("/WEB-INF/", resolverDirectFieldAccessor.getPropertyValue("prefix"));
assertEquals(".jsp", resolverDirectFieldAccessor.getPropertyValue("suffix"));
}
@Test
public void tilesViewResolution() {
registry.tiles().checkRefresh(true).definition("def1").definition("def2");
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(TilesViewResolver.class, registry.getViewResolvers().get(0).getClass());
assertNotNull(registry.getTilesConfigurer());
TilesConfigurer configurer = registry.getTilesConfigurer();
DirectFieldAccessor configurerDirectFieldAccessor = new DirectFieldAccessor(configurer);
assertTrue((boolean) configurerDirectFieldAccessor.getPropertyValue("checkRefresh"));
assertNotNull(configurerDirectFieldAccessor.getPropertyValue("definitions"));
String[] definitions = (String[])configurerDirectFieldAccessor.getPropertyValue("definitions");
assertEquals(2, definitions.length);
assertEquals("def1", definitions[0]);
assertEquals("def2", definitions[1]);
}
@Test
public void velocityViewResolution() {
registry.velocity().prefix("/").suffix(".vm").cache(true).resourceLoaderPath("testResourceLoaderPath");
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(VelocityViewResolver.class, registry.getViewResolvers().get(0).getClass());
VelocityViewResolver resolver = (VelocityViewResolver)registry.getViewResolvers().get(0);
DirectFieldAccessor resolverDirectFieldAccessor = new DirectFieldAccessor(resolver);
assertEquals("/", resolverDirectFieldAccessor.getPropertyValue("prefix"));
assertEquals(".vm", resolverDirectFieldAccessor.getPropertyValue("suffix"));
assertEquals(1024, resolverDirectFieldAccessor.getPropertyValue("cacheLimit"));
assertNotNull(registry.getVelocityConfigurer());
VelocityConfigurer configurer = registry.getVelocityConfigurer();
DirectFieldAccessor configurerDirectFieldAccessor = new DirectFieldAccessor(configurer);
assertEquals("testResourceLoaderPath", configurerDirectFieldAccessor.getPropertyValue("resourceLoaderPath"));
}
@Test
public void defaultVelocityViewResolution() {
registry.velocity();
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(VelocityViewResolver.class, registry.getViewResolvers().get(0).getClass());
VelocityViewResolver resolver = (VelocityViewResolver)registry.getViewResolvers().get(0);
DirectFieldAccessor resolverDirectFieldAccessor = new DirectFieldAccessor(resolver);
assertEquals("", resolverDirectFieldAccessor.getPropertyValue("prefix"));
assertEquals(".vm", resolverDirectFieldAccessor.getPropertyValue("suffix"));
assertNotNull(registry.getVelocityConfigurer());
VelocityConfigurer configurer = registry.getVelocityConfigurer();
DirectFieldAccessor configurerDirectFieldAccessor = new DirectFieldAccessor(configurer);
assertEquals("/WEB-INF/", configurerDirectFieldAccessor.getPropertyValue("resourceLoaderPath"));
}
@Test
public void freeMarkerViewResolution() {
registry.freemarker().prefix("/").suffix(".fmt").cache(false).templateLoaderPath("path1", "path2");
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(FreeMarkerViewResolver.class, registry.getViewResolvers().get(0).getClass());
FreeMarkerViewResolver resolver = (FreeMarkerViewResolver)registry.getViewResolvers().get(0);
DirectFieldAccessor resolverDirectFieldAccessor = new DirectFieldAccessor(resolver);
assertEquals("/", resolverDirectFieldAccessor.getPropertyValue("prefix"));
assertEquals(".fmt", resolverDirectFieldAccessor.getPropertyValue("suffix"));
assertEquals(0, resolverDirectFieldAccessor.getPropertyValue("cacheLimit"));
assertNotNull(registry.getFreeMarkerConfigurer());
FreeMarkerConfigurer configurer = registry.getFreeMarkerConfigurer();
DirectFieldAccessor configurerDirectFieldAccessor = new DirectFieldAccessor(configurer);
assertNotNull(configurerDirectFieldAccessor.getPropertyValue("templateLoaderPaths"));
String[] templateLoaderPaths = (String[])configurerDirectFieldAccessor.getPropertyValue("templateLoaderPaths");
assertEquals(2, templateLoaderPaths.length);
assertEquals("path1", templateLoaderPaths[0]);
assertEquals("path2", templateLoaderPaths[1]);
}
@Test
public void defaultFreeMarkerViewResolution() {
registry.freemarker();
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(FreeMarkerViewResolver.class, registry.getViewResolvers().get(0).getClass());
FreeMarkerViewResolver resolver = (FreeMarkerViewResolver)registry.getViewResolvers().get(0);
DirectFieldAccessor resolverDirectFieldAccessor = new DirectFieldAccessor(resolver);
assertEquals("", resolverDirectFieldAccessor.getPropertyValue("prefix"));
assertEquals(".ftl", resolverDirectFieldAccessor.getPropertyValue("suffix"));
DirectFieldAccessor configurerDirectFieldAccessor = new DirectFieldAccessor(registry.getFreeMarkerConfigurer());
assertArrayEquals(new String[]{"/WEB-INF/"}, (String[])configurerDirectFieldAccessor.getPropertyValue("templateLoaderPaths"));
}
@Test
public void contentNegotiatingViewResolution() {
registry.contentNegotiating().useNotAcceptable(false).defaultViews(new MappingJackson2JsonView());
assertNotNull(registry.getViewResolvers());
assertEquals(1, registry.getViewResolvers().size());
assertEquals(ContentNegotiatingViewResolver.class, registry.getViewResolvers().get(0).getClass());
}
@Test
public void multipleViewResolutions() {
registry.jsp().and().beanName();
assertNotNull(registry.getViewResolvers());
assertEquals(2, registry.getViewResolvers().size());
}
}

View File

@@ -17,6 +17,7 @@
package org.springframework.web.servlet.config.annotation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import java.util.Arrays;
@@ -24,6 +25,7 @@ import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.core.Ordered;
import org.springframework.tests.sample.beans.TestBean;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.io.FileSystemResourceLoader;
@@ -54,8 +56,7 @@ import org.springframework.web.context.support.StaticWebApplicationContext;
import org.springframework.web.method.annotation.ModelAttributeMethodProcessor;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.*;
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
import org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor;
import org.springframework.web.servlet.handler.HandlerExceptionResolverComposite;
@@ -65,12 +66,16 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.servlet.resource.ResourceUrlProviderExposingInterceptor;
import org.springframework.web.util.UrlPathHelper;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
/**
* A test fixture with a sub-class of {@link WebMvcConfigurationSupport} that
* implements the various {@link WebMvcConfigurer} extension points.
*
* @author Rossen Stoyanchev
* @author Sebastien Deleuze
*/
public class WebMvcConfigurationSupportExtensionTests {
@@ -78,7 +83,6 @@ public class WebMvcConfigurationSupportExtensionTests {
private StaticWebApplicationContext webAppContext;
@Before
public void setUp() {
this.webAppContext = new StaticWebApplicationContext();
@@ -211,6 +215,28 @@ public class WebMvcConfigurationSupportExtensionTests {
assertEquals(1, composite.getExceptionResolvers().size());
}
@Test
public void viewResolvers() throws Exception {
ViewResolverComposite viewResolver = webConfig.viewResolverComposite();
assertEquals(Ordered.LOWEST_PRECEDENCE, viewResolver.getOrder());
List<ViewResolver> viewResolvers = viewResolver.getViewResolvers();
DirectFieldAccessor viewResolverFieldAccessor = new DirectFieldAccessor(viewResolvers.get(0));
assertEquals(1, viewResolvers.size());
assertEquals(ContentNegotiatingViewResolver.class, viewResolvers.get(0).getClass());
assertFalse((Boolean)viewResolverFieldAccessor.getPropertyValue("useNotAcceptableStatusCode"));
List<View> defaultViews = (List<View>)viewResolverFieldAccessor.getPropertyValue("defaultViews");
assertNotNull(defaultViews);
assertEquals(1, defaultViews.size());
assertEquals(MappingJackson2JsonView.class, defaultViews.get(0).getClass());
assertNotNull(viewResolverFieldAccessor.getPropertyValue("contentNegotiationManager"));
viewResolvers = (List<ViewResolver>)viewResolverFieldAccessor.getPropertyValue("viewResolvers");
assertNotNull(viewResolvers);
assertEquals(1, viewResolvers.size());
assertEquals(InternalResourceViewResolver.class, viewResolvers.get(0).getClass());
viewResolverFieldAccessor = new DirectFieldAccessor(viewResolvers.get(0));
assertEquals("/", viewResolverFieldAccessor.getPropertyValue("prefix"));
assertEquals(".jsp", viewResolverFieldAccessor.getPropertyValue("suffix"));
}
@Controller
private static class TestController {
@@ -312,6 +338,12 @@ public class WebMvcConfigurationSupportExtensionTests {
registry.addViewController("/path");
}
@Override
public void configureViewResolution(ViewResolutionRegistry registry) {
registry.jsp("/", ".jsp");
registry.contentNegotiating().useNotAcceptable(false).defaultViews(new MappingJackson2JsonView());
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("src/test/java");

View File

@@ -22,11 +22,11 @@ import javax.servlet.http.HttpServletRequest;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.core.Ordered;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.core.convert.ConversionService;
import org.springframework.format.annotation.DateTimeFormat;
@@ -48,6 +48,8 @@ import org.springframework.web.context.support.AnnotationConfigWebApplicationCon
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.ViewResolverComposite;
import org.springframework.web.servlet.handler.AbstractHandlerMapping;
import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;
import org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor;
@@ -69,6 +71,7 @@ import static org.junit.Assert.*;
*
* @author Rossen Stoyanchev
* @author Juergen Hoeller
* @author Sebastien Deleuze
*/
public class WebMvcConfigurationSupportTests {
@@ -199,6 +202,14 @@ public class WebMvcConfigurationSupportTests {
assertEquals(1, interceptors.size());
assertEquals(JsonViewResponseBodyAdvice.class, interceptors.get(0).getClass());
}
@Test
public void viewResolvers() throws Exception {
ViewResolverComposite compositeResolver = this.wac.getBean(ViewResolverComposite.class);
assertEquals(Ordered.LOWEST_PRECEDENCE, compositeResolver.getOrder());
List<ViewResolver> viewResolvers = compositeResolver.getViewResolvers();
assertEquals(0, viewResolvers.size());
}
@Test
public void defaultPathMatchConfiguration() throws Exception {