diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationAdapter.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationAdapter.java index 81896bd387..562b1bc0e3 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationAdapter.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationAdapter.java @@ -133,9 +133,10 @@ public class MethodValidationAdapter implements MethodValidator { } private static Supplier initValidatorAdapter(Supplier validatorSupplier) { - Validator validator = validatorSupplier.get(); - return (validator instanceof SpringValidatorAdapter validatorAdapter ? - (() -> validatorAdapter) : SingletonSupplier.of(() -> new SpringValidatorAdapter(validator))); + return SingletonSupplier.of(() -> { + Validator validator = validatorSupplier.get(); + return (validator instanceof SpringValidatorAdapter sva ? sva : new SpringValidatorAdapter(validator)); + }); } diff --git a/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java b/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java index c57ffb3415..5c401b63cf 100644 --- a/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java +++ b/spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java @@ -32,6 +32,7 @@ import org.junit.jupiter.api.Test; import org.springframework.aop.framework.ProxyFactory; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -54,7 +55,7 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; * and/or {@link MethodValidationPostProcessor}. * * @author Juergen Hoeller - * @author Rossen Stoyanchevß + * @author Rossen Stoyanchev */ public class MethodValidationProxyTests { @@ -109,19 +110,29 @@ public class MethodValidationProxyTests { @Test public void testLazyValidatorForMethodValidation() { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( - LazyMethodValidationConfig.class, CustomValidatorBean.class, - MyValidBean.class, MyValidFactoryBean.class); - context.getBeansOfType(MyValidInterface.class).values().forEach(bean -> bean.myValidMethod("value", 5)); - context.close(); + doTestLazyValidatorForMethodValidation(LazyMethodValidationConfig.class); } @Test public void testLazyValidatorForMethodValidationWithProxyTargetClass() { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( - LazyMethodValidationConfigWithProxyTargetClass.class, CustomValidatorBean.class, - MyValidBean.class, MyValidFactoryBean.class); + doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithProxyTargetClass.class); + } + + @Test + public void testLazyValidatorForMethodValidationWithValidatorProvider() { + doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithValidatorProvider.class); + } + + private void doTestLazyValidatorForMethodValidation(Class configClass) { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(configClass, CustomValidatorBean.class, MyValidBean.class, MyValidFactoryBean.class); + context.getDefaultListableBeanFactory().getBeanDefinition("customValidatorBean").setLazyInit(true); + context.refresh(); + + assertThat(context.getDefaultListableBeanFactory().containsSingleton("customValidatorBean")).isFalse(); context.getBeansOfType(MyValidInterface.class).values().forEach(bean -> bean.myValidMethod("value", 5)); + assertThat(context.getDefaultListableBeanFactory().containsSingleton("customValidatorBean")).isTrue(); + context.close(); } @@ -256,4 +267,16 @@ public class MethodValidationProxyTests { } } + + @Configuration + public static class LazyMethodValidationConfigWithValidatorProvider { + + @Bean + public static MethodValidationPostProcessor methodValidationPostProcessor(ObjectProvider validator) { + MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); + postProcessor.setValidatorProvider(validator); + return postProcessor; + } + } + }