From 16c3c15204a8040ee3efe81eaf2da452501cffdf Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 21 May 2013 17:10:13 +0200 Subject: [PATCH] DATACMNS-330, DATACMNS-331 - Improved web configuration support. Updated backing implementation of @EnableSpringDataWebSupport to use WebMvcConfigurerAdapter instead of WebMvcConfigurationSupport as the latter is a very custom beast in terms of configuration. Let the Spring HATEOAS specific configuration class extend the default one to register additional components. The default one accesses the FormattingConversionService through a qualified autowiring. It issues a warning in case none has been configured and asks the user to enable Spring MVC. Updated Sonargraph architecture description to allow logging from web config layer. --- Spring Data Commons.sonargraph | 13 ++++++++-- .../config/EnableSpringDataWebSupport.java | 13 ++-------- ...ateoasAwareSpringDataWebConfiguration.java | 15 ++++------- .../config/SpringDataWebConfiguration.java | 25 ++++++++++++++++--- ...eSpringDataWebSupportIntegrationTests.java | 2 ++ 5 files changed, 42 insertions(+), 26 deletions(-) diff --git a/Spring Data Commons.sonargraph b/Spring Data Commons.sonargraph index 78949deee..881e12d26 100644 --- a/Spring Data Commons.sonargraph +++ b/Spring Data Commons.sonargraph @@ -10,11 +10,14 @@ + + - + + @@ -154,6 +157,12 @@ + + + + + + @@ -278,7 +287,7 @@ - + diff --git a/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java b/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java index e546f6adb..1bec124ee 100644 --- a/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java +++ b/src/main/java/org/springframework/data/web/config/EnableSpringDataWebSupport.java @@ -20,8 +20,6 @@ import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.util.ArrayList; -import java.util.List; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.ImportSelector; @@ -84,15 +82,8 @@ public @interface EnableSpringDataWebSupport { */ @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { - - List configs = new ArrayList(); - - if (HATEOAS_PRESENT) { - configs.add(HateoasAwareSpringDataWebConfiguration.class.getName()); - } - - configs.add(SpringDataWebConfiguration.class.getName()); - return configs.toArray(new String[configs.size()]); + return new String[] { HATEOAS_PRESENT ? HateoasAwareSpringDataWebConfiguration.class.getName() + : SpringDataWebConfiguration.class.getName() }; } } } diff --git a/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java b/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java index 80fe951ca..02892215a 100644 --- a/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java @@ -17,13 +17,11 @@ package org.springframework.data.web.config; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.web.PagedResourcesAssembler; import org.springframework.data.web.PagedResourcesAssemblerArgumentResolver; import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /** * JavaConfig class to register {@link PagedResourcesAssembler} and {@link PagedResourcesAssemblerArgumentResolver}. @@ -32,19 +30,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp * @author Oliver Gierke */ @Configuration -class HateoasAwareSpringDataWebConfiguration extends WebMvcConfigurationSupport { - - @Autowired - SpringDataWebConfiguration config; +class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfiguration { @Bean public PagedResourcesAssembler pagedResourcesAssembler() { - return new PagedResourcesAssembler(config.pageableResolver(), null); + return new PagedResourcesAssembler(pageableResolver(), null); } @Bean public PagedResourcesAssemblerArgumentResolver pagedResourcesAssemblerArgumentResolver() { - return new PagedResourcesAssemblerArgumentResolver(config.pageableResolver(), null); + return new PagedResourcesAssemblerArgumentResolver(pageableResolver(), null); } /* @@ -52,8 +47,8 @@ class HateoasAwareSpringDataWebConfiguration extends WebMvcConfigurationSupport * @see org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addArgumentResolvers(java.util.List) */ @Override - protected void addArgumentResolvers(List argumentResolvers) { - config.addArgumentResolvers(argumentResolvers); + public void addArgumentResolvers(List argumentResolvers) { + super.addArgumentResolvers(argumentResolvers); argumentResolvers.add(pagedResourcesAssemblerArgumentResolver()); } } diff --git a/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java b/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java index 6bf6617c4..5acf501d6 100644 --- a/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java @@ -17,6 +17,10 @@ package org.springframework.data.web.config; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.repository.support.DomainClassConverter; @@ -24,7 +28,7 @@ import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.data.web.SortHandlerMethodArgumentResolver; import org.springframework.format.support.FormattingConversionService; import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * Configuration class to register {@link PageableHandlerMethodArgumentResolver}, @@ -34,7 +38,13 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupp * @author Oliver Gierke */ @Configuration -class SpringDataWebConfiguration extends WebMvcConfigurationSupport { +class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { + + private static final Logger LOGGER = LoggerFactory.getLogger(SpringDataWebConfiguration.class); + + @Autowired(required = false) + @Qualifier("mvcConversionService") + FormattingConversionService conversionService; @Bean public PageableHandlerMethodArgumentResolver pageableResolver() { @@ -48,7 +58,16 @@ class SpringDataWebConfiguration extends WebMvcConfigurationSupport { @Bean public DomainClassConverter mvcDomainClassConverter() { - return new DomainClassConverter(mvcConversionService()); + + if (conversionService == null) { + + LOGGER.warn("No default Spring MVC FormattingConversionService registered! Have you forgotten to " + + "use @EnableWebMvc or register a configuration class extending WebMvcConfigurationSupport?"); + + return null; + } + + return new DomainClassConverter(conversionService); } /* diff --git a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java index c6f09dc35..025fd875c 100644 --- a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java +++ b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java @@ -35,6 +35,7 @@ import org.springframework.data.web.WebTestUtils; import org.springframework.data.web.config.EnableSpringDataWebSupport.SpringDataWebConfigurationImportSelector; import org.springframework.util.ReflectionUtils; import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; /** @@ -46,6 +47,7 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl public class EnableSpringDataWebSupportIntegrationTests { @Configuration + @EnableWebMvc @EnableSpringDataWebSupport static class SampleConfig {