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 45ba45f3b..4b5dd599d 100644 --- a/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/HateoasAwareSpringDataWebConfiguration.java @@ -37,10 +37,13 @@ import org.springframework.web.method.support.HandlerMethodArgumentResolver; * @author Nick Williams * @author Ben Hale * @author Vedran Pavic + * @author Mark Paluch */ -@Configuration +@Configuration(proxyBeanMethods = false) public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfiguration { + private final ApplicationContext context; + /** * @param context must not be {@literal null}. * @param conversionService must not be {@literal null}. @@ -48,6 +51,7 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu public HateoasAwareSpringDataWebConfiguration(ApplicationContext context, @Qualifier("mvcConversionService") ObjectFactory conversionService) { super(context, conversionService); + this.context = context; } /* @@ -59,7 +63,7 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu public HateoasPageableHandlerMethodArgumentResolver pageableResolver() { HateoasPageableHandlerMethodArgumentResolver pageableResolver = new HateoasPageableHandlerMethodArgumentResolver( - sortResolver()); + getSortResolverBean()); customizePageableResolver(pageableResolver); return pageableResolver; } @@ -79,12 +83,12 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu @Bean public PagedResourcesAssembler pagedResourcesAssembler() { - return new PagedResourcesAssembler<>(pageableResolver(), null); + return new PagedResourcesAssembler<>(getPageableResolverBean(), null); } @Bean public PagedResourcesAssemblerArgumentResolver pagedResourcesAssemblerArgumentResolver() { - return new PagedResourcesAssemblerArgumentResolver(pageableResolver(), null); + return new PagedResourcesAssemblerArgumentResolver(getPageableResolverBean(), null); } /* @@ -94,6 +98,23 @@ public class HateoasAwareSpringDataWebConfiguration extends SpringDataWebConfigu @Override public void addArgumentResolvers(List argumentResolvers) { super.addArgumentResolvers(argumentResolvers); - argumentResolvers.add(pagedResourcesAssemblerArgumentResolver()); + 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/ProjectingArgumentResolverRegistrar.java b/src/main/java/org/springframework/data/web/config/ProjectingArgumentResolverRegistrar.java index abfeab19f..5724c9fb6 100644 --- a/src/main/java/org/springframework/data/web/config/ProjectingArgumentResolverRegistrar.java +++ b/src/main/java/org/springframework/data/web/config/ProjectingArgumentResolverRegistrar.java @@ -38,9 +38,10 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl * {@link ProxyingHandlerMethodArgumentResolver}. * * @author Oliver Gierke + * @author Mark Paluch * @soundtrack Apparat With Soap & Skin - Goodbye (Dark Theme Song - https://www.youtube.com/watch?v=66VnOdk6oto) */ -@Configuration +@Configuration(proxyBeanMethods = false) public class ProjectingArgumentResolverRegistrar { /** diff --git a/src/main/java/org/springframework/data/web/config/QuerydslWebConfiguration.java b/src/main/java/org/springframework/data/web/config/QuerydslWebConfiguration.java index dc6123da7..7c25a387c 100644 --- a/src/main/java/org/springframework/data/web/config/QuerydslWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/QuerydslWebConfiguration.java @@ -18,6 +18,7 @@ package org.springframework.data.web.config; import java.util.List; import java.util.Optional; +import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; @@ -40,14 +41,16 @@ import com.querydsl.core.types.Predicate; * {@link Predicate}s from web requests. * * @author Oliver Gierke + * @author Mark Paluch * @since 1.11 * @soundtrack Anika Nilles - Alter Ego */ -@Configuration +@Configuration(proxyBeanMethods = false) public class QuerydslWebConfiguration implements WebMvcConfigurer { @Autowired @Qualifier("mvcConversionService") ObjectFactory conversionService; @Autowired ObjectProvider resolver; + @Autowired BeanFactory beanFactory; /** * Default {@link QuerydslPredicateArgumentResolver} to create Querydsl {@link Predicate} instances for Spring MVC @@ -58,7 +61,9 @@ public class QuerydslWebConfiguration implements WebMvcConfigurer { @Lazy @Bean public QuerydslPredicateArgumentResolver querydslPredicateArgumentResolver() { - return new QuerydslPredicateArgumentResolver(querydslBindingsFactory(), Optional.of(conversionService.getObject())); + return new QuerydslPredicateArgumentResolver( + beanFactory.getBean("querydslBindingsFactory", QuerydslBindingsFactory.class), + Optional.of(conversionService.getObject())); } @Lazy @@ -73,6 +78,7 @@ public class QuerydslWebConfiguration implements WebMvcConfigurer { */ @Override public void addArgumentResolvers(List argumentResolvers) { - argumentResolvers.add(0, querydslPredicateArgumentResolver()); + argumentResolvers.add(0, + beanFactory.getBean("querydslPredicateArgumentResolver", QuerydslPredicateArgumentResolver.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 9e2a4acc8..0c76a3fe3 100644 --- a/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/SpringDataWebConfiguration.java @@ -17,10 +17,8 @@ package org.springframework.data.web.config; import java.util.List; import java.util.Optional; -import java.util.function.Supplier; import org.springframework.beans.factory.BeanClassLoaderAware; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -55,8 +53,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @author Oliver Gierke * @author Vedran Pavic * @author Jens Schauder + * @author Mark Paluch */ -@Configuration +@Configuration(proxyBeanMethods = false) public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLoaderAware { private final ApplicationContext context; @@ -93,7 +92,7 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo public PageableHandlerMethodArgumentResolver pageableResolver() { PageableHandlerMethodArgumentResolver pageableResolver = // - new PageableHandlerMethodArgumentResolver(sortResolver()); + new PageableHandlerMethodArgumentResolver(getSortResolverBean()); customizePageableResolver(pageableResolver); return pageableResolver; } @@ -137,8 +136,8 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo @Override public void addArgumentResolvers(List argumentResolvers) { - argumentResolvers.add(sortResolver()); - argumentResolvers.add(pageableResolver()); + argumentResolvers.add(getSortResolverBean()); + argumentResolvers.add(getPageableResolverBean()); ProxyingHandlerMethodArgumentResolver resolver = new ProxyingHandlerMethodArgumentResolver(conversionService, true); resolver.setBeanFactory(context); @@ -157,7 +156,7 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo if (ClassUtils.isPresent("com.jayway.jsonpath.DocumentContext", context.getClassLoader()) && ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", context.getClassLoader())) { - ObjectMapper mapper = getUniqueBean(ObjectMapper.class, context, ObjectMapper::new); + ObjectMapper mapper = context.getBeanProvider(ObjectMapper.class).getIfUnique(ObjectMapper::new); ProjectingJackson2HttpMessageConverter converter = new ProjectingJackson2HttpMessageConverter(mapper); converter.setBeanFactory(context); @@ -173,6 +172,14 @@ 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)); } @@ -188,21 +195,4 @@ public class SpringDataWebConfiguration implements WebMvcConfigurer, BeanClassLo } } - /** - * Returns the uniquely available bean of the given type from the given {@link ApplicationContext} or the one provided - * by the given {@link Supplier} in case the initial lookup fails. - * - * @param type must not be {@literal null}. - * @param context must not be {@literal null}. - * @param fallback must not be {@literal null}. - * @return - */ - private static T getUniqueBean(Class type, ApplicationContext context, Supplier fallback) { - - try { - return context.getBean(type); - } catch (NoSuchBeanDefinitionException o_O) { - return fallback.get(); - } - } }