DATACMNS-1736 - Polishing.

Avoid reuse of Lazy instances for (Sort|Pageable)HandlerMethodArgumentResolver and consistently use those to avoid breaking API changes in configuration classes.
This commit is contained in:
Oliver Drotbohm
2020-09-15 16:59:24 +02:00
parent 9d12ac7324
commit 96097c290d
2 changed files with 31 additions and 28 deletions

View File

@@ -22,15 +22,12 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.convert.ConversionService;
import org.springframework.data.util.Lazy;
import org.springframework.data.web.HateoasPageableHandlerMethodArgumentResolver;
import org.springframework.data.web.HateoasSortHandlerMethodArgumentResolver;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
import org.springframework.data.web.PagedResourcesAssembler;
import org.springframework.data.web.PagedResourcesAssemblerArgumentResolver;
import org.springframework.data.web.SortHandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
/**
@@ -42,11 +39,14 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver;
* @author Ben Hale
* @author Vedran Pavic
* @author Mark Paluch
* @author Greg Turnquist
*/
@Configuration(proxyBeanMethods = false)
public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfiguration {
private final ApplicationContext context;
private final Lazy<HateoasSortHandlerMethodArgumentResolver> sortResolver;
private final Lazy<HateoasPageableHandlerMethodArgumentResolver> pageableResolver;
private final Lazy<PagedResourcesAssemblerArgumentResolver> argumentResolver;
/**
* @param context must not be {@literal null}.
@@ -54,24 +54,27 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu
*/
public HateoasAwareSpringDataWebConfiguration(ApplicationContext context,
@Qualifier("mvcConversionService") ObjectFactory<ConversionService> conversionService) {
super(context, conversionService);
this.context = context;
this.sortResolver = Lazy
.of(() -> context.getBean("hateoasSortResolver", HateoasSortHandlerMethodArgumentResolver.class));
this.pageableResolver = Lazy
.of(() -> context.getBean("hateoasPageableResolver", HateoasPageableHandlerMethodArgumentResolver.class));
super(context, conversionService);
this.sortResolver = Lazy
.of(() -> context.getBean("sortResolver", HateoasSortHandlerMethodArgumentResolver.class));
this.pageableResolver = Lazy
.of(() -> context.getBean("pageableResolver", HateoasPageableHandlerMethodArgumentResolver.class));
this.argumentResolver = Lazy.of(() -> context.getBean("pagedResourcesAssemblerArgumentResolver",
PagedResourcesAssemblerArgumentResolver.class));
}
/*
* (non-Javadoc)
* @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver()
*/
@Override
@Bean
public HateoasPageableHandlerMethodArgumentResolver hateoasPageableResolver() {
public HateoasPageableHandlerMethodArgumentResolver pageableResolver() {
HateoasPageableHandlerMethodArgumentResolver pageableResolver = new HateoasPageableHandlerMethodArgumentResolver(
(HateoasSortHandlerMethodArgumentResolver) this.sortResolver.get());
this.sortResolver.get());
customizePageableResolver(pageableResolver);
return pageableResolver;
}
@@ -81,7 +84,8 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu
* @see org.springframework.data.web.config.SpringDataWebConfiguration#sortResolver()
*/
@Bean
public HateoasSortHandlerMethodArgumentResolver hateoasSortResolver() {
@Override
public HateoasSortHandlerMethodArgumentResolver sortResolver() {
HateoasSortHandlerMethodArgumentResolver sortResolver = new HateoasSortHandlerMethodArgumentResolver();
customizeSortResolver(sortResolver);
@@ -89,15 +93,13 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu
}
@Bean
public PagedResourcesAssembler<?> pagedResourcesAssembler(
HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
return new PagedResourcesAssembler<>(pageableResolver, null);
public PagedResourcesAssembler<?> pagedResourcesAssembler() {
return new PagedResourcesAssembler<>(pageableResolver.get(), null);
}
@Bean
public PagedResourcesAssemblerArgumentResolver pagedResourcesAssemblerArgumentResolver(
HateoasPageableHandlerMethodArgumentResolver pageableResolver) {
return new PagedResourcesAssemblerArgumentResolver(pageableResolver, null);
public PagedResourcesAssemblerArgumentResolver pagedResourcesAssemblerArgumentResolver() {
return new PagedResourcesAssemblerArgumentResolver(pageableResolver.get(), null);
}
/*
@@ -106,8 +108,9 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers
.add(context.getBean("pagedResourcesAssemblerArgumentResolver", PagedResourcesAssemblerArgumentResolver.class));
argumentResolvers.add(argumentResolver.get());
}
}

View File

@@ -55,6 +55,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
* @author Vedran Pavic
* @author Jens Schauder
* @author Mark Paluch
* @author Greg Turnquist
*/
@Configuration(proxyBeanMethods = false)
public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLoaderAware {
@@ -63,8 +64,8 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
private final ObjectFactory<ConversionService> conversionService;
private @Nullable ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
protected Lazy<SortHandlerMethodArgumentResolver> sortResolver;
protected Lazy<PageableHandlerMethodArgumentResolver> pageableResolver;
private final Lazy<SortHandlerMethodArgumentResolver> sortResolver;
private final Lazy<PageableHandlerMethodArgumentResolver> pageableResolver;
private @Autowired Optional<PageableHandlerMethodArgumentResolverCustomizer> pageableResolverCustomizer;
private @Autowired Optional<SortHandlerMethodArgumentResolverCustomizer> sortResolverCustomizer;
@@ -96,10 +97,10 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
* @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver()
*/
@Bean
public PageableHandlerMethodArgumentResolver pageableResolver(SortHandlerMethodArgumentResolver sortResolver) {
public PageableHandlerMethodArgumentResolver pageableResolver() {
PageableHandlerMethodArgumentResolver pageableResolver = //
new PageableHandlerMethodArgumentResolver(sortResolver);
new PageableHandlerMethodArgumentResolver(sortResolver.get());
customizePageableResolver(pageableResolver);
return pageableResolver;
}
@@ -143,8 +144,8 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(this.sortResolver.get());
argumentResolvers.add(this.pageableResolver.get());
argumentResolvers.add(sortResolver.get());
argumentResolvers.add(pageableResolver.get());
ProxyingHandlerMethodArgumentResolver resolver = new ProxyingHandlerMethodArgumentResolver(conversionService, true);
resolver.setBeanFactory(context);
@@ -193,5 +194,4 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo
target.setBeanClassLoader(beanClassLoader);
}
}
}