From 364ed9ab2e281a1190a04f3367f5b8937406a813 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Thu, 23 Mar 2017 11:25:43 +0100 Subject: [PATCH] DATACMNS-822 - Polishing. Replaced optional dependencies with Optional and explicit null checks with calls to ifPresent. Used Lambda style instead of anonymous classes where applicable. Converted Hamcrest matchers to AssertJ. Minor improvements to formatting. Original pull request: #208. --- src/main/asciidoc/repositories.adoc | 11 ++++++- ...ateoasAwareSpringDataWebConfiguration.java | 4 ++- .../config/SpringDataWebConfiguration.java | 32 +++++++++---------- ...eSpringDataWebSupportIntegrationTests.java | 31 +++++------------- 4 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/main/asciidoc/repositories.adoc b/src/main/asciidoc/repositories.adoc index 75ec69119..edf10b3eb 100644 --- a/src/main/asciidoc/repositories.adoc +++ b/src/main/asciidoc/repositories.adoc @@ -923,7 +923,16 @@ This method signature will cause Spring MVC try to derive a Pageable instance fr |`sort`|Properties that should be sorted by in the format `property,property(,ASC\|DESC)`. Default sort direction is ascending. Use multiple `sort` parameters if you want to switch directions, e.g. `?sort=firstname&sort=lastname,asc`. |=============== -To customize this behavior extend either `SpringDataWebConfiguration` or the HATEOAS-enabled equivalent and override the `pageableResolver()` or `sortResolver()` methods and import your customized configuration file instead of using the `@Enable`-annotation. +To customize this behavior register a bean implementing the interface `PageableHandlerMethodArgumentResolverCustomizer` or `SortHandlerMethodArgumentResolverCustomizer` respectively. It's `customize()` method will get called allowing you to change settings. Like in the following example. + +[source, java] +---- +@Bean SortHandlerMethodArgumentResolverCustomizer sortCustomizer() { + return s -> s.setPropertyDelimiter("<-->"); +} +---- + +If setting the properties of an existing `MethodArgumentResolver` isn't sufficient for your purpose extend either `SpringDataWebConfiguration` or the HATEOAS-enabled equivalent and override the `pageableResolver()` or `sortResolver()` methods and import your customized configuration file instead of using the `@Enable`-annotation. In case you need multiple `Pageable` or `Sort` instances to be resolved from the request (for multiple tables, for example) you can use Spring's `@Qualifier` annotation to distinguish one from another. The request parameters then have to be prefixed with `${qualifier}_`. So for a method signature like this: 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 dcb2755f9..069f2d6c0 100644 --- a/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java @@ -57,7 +57,8 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu @Bean @Override public HateoasPageableHandlerMethodArgumentResolver pageableResolver() { - HateoasPageableHandlerMethodArgumentResolver pageableResolver = + + HateoasPageableHandlerMethodArgumentResolver pageableResolver = // new HateoasPageableHandlerMethodArgumentResolver(sortResolver()); customizePageableResolver(pageableResolver); return pageableResolver; @@ -70,6 +71,7 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu @Bean @Override public HateoasSortHandlerMethodArgumentResolver sortResolver() { + HateoasSortHandlerMethodArgumentResolver sortResolver = new HateoasSortHandlerMethodArgumentResolver(); customizeSortResolver(sortResolver); return sortResolver; 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 c45be1100..76b4af18e 100644 --- a/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java @@ -16,8 +16,10 @@ package org.springframework.data.web.config; import java.util.List; +import java.util.Optional; import org.springframework.beans.factory.ObjectFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -55,26 +57,26 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { private final ApplicationContext context; private final ObjectFactory conversionService; - public SpringDataWebConfiguration(ApplicationContext context, - @Qualifier("mvcConversionService") ObjectFactory conversionService) { + @Autowired private Optional pageableResolverCustomizer; + @Autowired private Optional sortResolverCustomizer; + + public SpringDataWebConfiguration( // + ApplicationContext context, // + @Qualifier("mvcConversionService") ObjectFactory conversionService // + ) { this.context = context; this.conversionService = conversionService; } - @Autowired(required = false) - private PageableHandlerMethodArgumentResolverCustomizer pageableResolverCustomizer; - - @Autowired(required = false) - private SortHandlerMethodArgumentResolverCustomizer sortResolverCustomizer; - /* * (non-Javadoc) * @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver() */ @Bean public PageableHandlerMethodArgumentResolver pageableResolver() { - PageableHandlerMethodArgumentResolver pageableResolver = + + PageableHandlerMethodArgumentResolver pageableResolver = // new PageableHandlerMethodArgumentResolver(sortResolver()); customizePageableResolver(pageableResolver); return pageableResolver; @@ -86,6 +88,7 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { */ @Bean public SortHandlerMethodArgumentResolver sortResolver() { + SortHandlerMethodArgumentResolver sortResolver = new SortHandlerMethodArgumentResolver(); customizeSortResolver(sortResolver); return sortResolver; @@ -107,8 +110,7 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { FormattingConversionService conversionService = (FormattingConversionService) registry; - DomainClassConverter converter = new DomainClassConverter<>( - conversionService); + DomainClassConverter converter = new DomainClassConverter<>(conversionService); converter.setApplicationContext(context); } @@ -153,15 +155,11 @@ public class SpringDataWebConfiguration extends WebMvcConfigurerAdapter { } protected void customizePageableResolver(PageableHandlerMethodArgumentResolver pageableResolver) { - if (this.pageableResolverCustomizer != null) { - this.pageableResolverCustomizer.customize(pageableResolver); - } + pageableResolverCustomizer.ifPresent(c -> c.customize(pageableResolver)); } protected void customizeSortResolver(SortHandlerMethodArgumentResolver sortResolver) { - if (this.sortResolverCustomizer != null) { - this.sortResolverCustomizer.customize(sortResolver); - } + sortResolverCustomizer.ifPresent(c -> c.customize(sortResolver)); } } 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 690600e5e..f039284f6 100755 --- a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java +++ b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java @@ -72,16 +72,8 @@ public class EnableSpringDataWebSupportIntegrationTests { @Bean public PageableHandlerMethodArgumentResolverCustomizer testPageableResolverCustomizer() { - return new PageableHandlerMethodArgumentResolverCustomizer() { - - @Override - public void customize(PageableHandlerMethodArgumentResolver pageableResolver) { - pageableResolver.setMaxPageSize(100); - } - - }; + return pageableResolver -> pageableResolver.setMaxPageSize(100); } - } @Configuration @@ -91,16 +83,8 @@ public class EnableSpringDataWebSupportIntegrationTests { @Bean public SortHandlerMethodArgumentResolverCustomizer testSortResolverCustomizer() { - return new SortHandlerMethodArgumentResolverCustomizer() { - - @Override - public void customize(SortHandlerMethodArgumentResolver sortResolver) { - sortResolver.setSortParameter("foo"); - } - - }; + return sortResolver -> sortResolver.setSortParameter("foo"); } - } @Test // DATACMNS-330 @@ -126,7 +110,6 @@ public class EnableSpringDataWebSupportIntegrationTests { } @Test // DATACMNS-330 - // @ClassLoaderConfiguration(hidePackage = Link.class) public void doesNotRegisterHateoasSpecificComponentsIfHateoasNotPresent() throws Exception { HidingClassLoader classLoader = HidingClassLoader.hide(Link.class); @@ -201,22 +184,24 @@ public class EnableSpringDataWebSupportIntegrationTests { @Test // DATACMNS-822 public void picksUpPageableResolverCustomizer() { + ApplicationContext context = WebTestUtils.createApplicationContext(PageableResolverCustomizerConfig.class); List names = Arrays.asList(context.getBeanDefinitionNames()); PageableHandlerMethodArgumentResolver resolver = context.getBean(PageableHandlerMethodArgumentResolver.class); - assertThat(names, hasItem("testPageableResolverCustomizer")); - assertThat((Integer) ReflectionTestUtils.getField(resolver, "maxPageSize"), equalTo(100)); + assertThat(names).contains("testPageableResolverCustomizer"); + assertThat((Integer) ReflectionTestUtils.getField(resolver, "maxPageSize")).isEqualTo(100); } @Test // DATACMNS-822 public void picksUpSortResolverCustomizer() { + ApplicationContext context = WebTestUtils.createApplicationContext(SortResolverCustomizerConfig.class); List names = Arrays.asList(context.getBeanDefinitionNames()); SortHandlerMethodArgumentResolver resolver = context.getBean(SortHandlerMethodArgumentResolver.class); - assertThat(names, hasItem("testSortResolverCustomizer")); - assertThat((String) ReflectionTestUtils.getField(resolver, "sortParameter"), equalTo("foo")); + assertThat(names).contains("testSortResolverCustomizer"); + assertThat((String) ReflectionTestUtils.getField(resolver, "sortParameter")).isEqualTo("foo"); } private static void assertResolversRegistered(ApplicationContext context, Class... resolverTypes) {