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.
This commit is contained in:
committed by
Oliver Gierke
parent
c1036b2204
commit
364ed9ab2e
@@ -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:
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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> conversionService;
|
||||
|
||||
public SpringDataWebConfiguration(ApplicationContext context,
|
||||
@Qualifier("mvcConversionService") ObjectFactory<ConversionService> conversionService) {
|
||||
@Autowired private Optional<PageableHandlerMethodArgumentResolverCustomizer> pageableResolverCustomizer;
|
||||
@Autowired private Optional<SortHandlerMethodArgumentResolverCustomizer> sortResolverCustomizer;
|
||||
|
||||
public SpringDataWebConfiguration( //
|
||||
ApplicationContext context, //
|
||||
@Qualifier("mvcConversionService") ObjectFactory<ConversionService> 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<FormattingConversionService> converter = new DomainClassConverter<>(
|
||||
conversionService);
|
||||
DomainClassConverter<FormattingConversionService> 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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<String> 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<String> 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) {
|
||||
|
||||
Reference in New Issue
Block a user