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 4b5dd599d..8563fdcfe 100644 --- a/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java @@ -22,11 +22,15 @@ 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; /** @@ -52,6 +56,11 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu @Qualifier("mvcConversionService") ObjectFactory 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)); + } /* @@ -59,11 +68,10 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu * @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver() */ @Bean - @Override - public HateoasPageableHandlerMethodArgumentResolver pageableResolver() { + public HateoasPageableHandlerMethodArgumentResolver hateoasPageableResolver() { HateoasPageableHandlerMethodArgumentResolver pageableResolver = new HateoasPageableHandlerMethodArgumentResolver( - getSortResolverBean()); + (HateoasSortHandlerMethodArgumentResolver) this.sortResolver.get()); customizePageableResolver(pageableResolver); return pageableResolver; } @@ -73,8 +81,7 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu * @see org.springframework.data.web.config.SpringDataWebConfiguration#sortResolver() */ @Bean - @Override - public HateoasSortHandlerMethodArgumentResolver sortResolver() { + public HateoasSortHandlerMethodArgumentResolver hateoasSortResolver() { HateoasSortHandlerMethodArgumentResolver sortResolver = new HateoasSortHandlerMethodArgumentResolver(); customizeSortResolver(sortResolver); @@ -82,13 +89,15 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu } @Bean - public PagedResourcesAssembler pagedResourcesAssembler() { - return new PagedResourcesAssembler<>(getPageableResolverBean(), null); + public PagedResourcesAssembler pagedResourcesAssembler( + HateoasPageableHandlerMethodArgumentResolver pageableResolver) { + return new PagedResourcesAssembler<>(pageableResolver, null); } @Bean - public PagedResourcesAssemblerArgumentResolver pagedResourcesAssemblerArgumentResolver() { - return new PagedResourcesAssemblerArgumentResolver(getPageableResolverBean(), null); + public PagedResourcesAssemblerArgumentResolver pagedResourcesAssemblerArgumentResolver( + HateoasPageableHandlerMethodArgumentResolver pageableResolver) { + return new PagedResourcesAssemblerArgumentResolver(pageableResolver, null); } /* @@ -101,20 +110,4 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu argumentResolvers .add(context.getBean("pagedResourcesAssemblerArgumentResolver", PagedResourcesAssemblerArgumentResolver.class)); } - - /* - * (non-Javadoc) - * @see org.springframework.data.web.config.SpringDataWebConfiguration#getSortResolverBean() - */ - protected HateoasSortHandlerMethodArgumentResolver getSortResolverBean() { - return context.getBean("sortResolver", HateoasSortHandlerMethodArgumentResolver.class); - } - - /* - * (non-Javadoc) - * @see org.springframework.data.web.config.SpringDataWebConfiguration#getPageableResolverBean() - */ - protected HateoasPageableHandlerMethodArgumentResolver getPageableResolverBean() { - return context.getBean("pageableResolver", HateoasPageableHandlerMethodArgumentResolver.class); - } } 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 0c76a3fe3..4f0f6768c 100644 --- a/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java @@ -29,6 +29,7 @@ import org.springframework.core.convert.ConversionService; import org.springframework.data.geo.format.DistanceFormatter; import org.springframework.data.geo.format.PointFormatter; import org.springframework.data.repository.support.DomainClassConverter; +import org.springframework.data.util.Lazy; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.data.web.ProjectingJackson2HttpMessageConverter; import org.springframework.data.web.ProxyingHandlerMethodArgumentResolver; @@ -62,6 +63,9 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo private final ObjectFactory conversionService; private @Nullable ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader(); + protected Lazy sortResolver; + protected Lazy pageableResolver; + private @Autowired Optional pageableResolverCustomizer; private @Autowired Optional sortResolverCustomizer; @@ -73,6 +77,9 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo this.context = context; this.conversionService = conversionService; + this.sortResolver = Lazy.of(() -> context.getBean("sortResolver", SortHandlerMethodArgumentResolver.class)); + this.pageableResolver = Lazy + .of(() -> context.getBean("pageableResolver", PageableHandlerMethodArgumentResolver.class)); } /* @@ -89,10 +96,10 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo * @see org.springframework.data.web.config.SpringDataWebConfiguration#pageableResolver() */ @Bean - public PageableHandlerMethodArgumentResolver pageableResolver() { + public PageableHandlerMethodArgumentResolver pageableResolver(SortHandlerMethodArgumentResolver sortResolver) { PageableHandlerMethodArgumentResolver pageableResolver = // - new PageableHandlerMethodArgumentResolver(getSortResolverBean()); + new PageableHandlerMethodArgumentResolver(sortResolver); customizePageableResolver(pageableResolver); return pageableResolver; } @@ -136,8 +143,8 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo @Override public void addArgumentResolvers(List argumentResolvers) { - argumentResolvers.add(getSortResolverBean()); - argumentResolvers.add(getPageableResolverBean()); + argumentResolvers.add(this.sortResolver.get()); + argumentResolvers.add(this.pageableResolver.get()); ProxyingHandlerMethodArgumentResolver resolver = new ProxyingHandlerMethodArgumentResolver(conversionService, true); resolver.setBeanFactory(context); @@ -172,14 +179,6 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo } } - protected SortHandlerMethodArgumentResolver getSortResolverBean() { - return context.getBean("sortResolver", SortHandlerMethodArgumentResolver.class); - } - - protected PageableHandlerMethodArgumentResolver getPageableResolverBean() { - return context.getBean("pageableResolver", PageableHandlerMethodArgumentResolver.class); - } - protected void customizePageableResolver(PageableHandlerMethodArgumentResolver pageableResolver) { pageableResolverCustomizer.ifPresent(c -> c.customize(pageableResolver)); } 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 e55416f13..1e342c38a 100755 --- a/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java +++ b/src/test/java/org/springframework/data/web/config/EnableSpringDataWebSupportIntegrationTests.java @@ -204,7 +204,7 @@ class EnableSpringDataWebSupportIntegrationTests { ApplicationContext context = WebTestUtils.createApplicationContext(PageableResolverCustomizerConfig.class); List names = Arrays.asList(context.getBeanDefinitionNames()); - PageableHandlerMethodArgumentResolver resolver = context.getBean(PageableHandlerMethodArgumentResolver.class); + PageableHandlerMethodArgumentResolver resolver = context.getBean("pageableResolver", PageableHandlerMethodArgumentResolver.class); assertThat(names).contains("testPageableResolverCustomizer"); assertThat((Integer) ReflectionTestUtils.getField(resolver, "maxPageSize")).isEqualTo(100); @@ -215,7 +215,7 @@ class EnableSpringDataWebSupportIntegrationTests { ApplicationContext context = WebTestUtils.createApplicationContext(SortResolverCustomizerConfig.class); List names = Arrays.asList(context.getBeanDefinitionNames()); - SortHandlerMethodArgumentResolver resolver = context.getBean(SortHandlerMethodArgumentResolver.class); + SortHandlerMethodArgumentResolver resolver = context.getBean("sortResolver", SortHandlerMethodArgumentResolver.class); assertThat(names).contains("testSortResolverCustomizer"); assertThat((String) ReflectionTestUtils.getField(resolver, "sortParameter")).isEqualTo("foo");