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) {