Lazily obtain Validator from original Supplier

Closes gh-31137
This commit is contained in:
Juergen Hoeller
2023-09-03 00:42:52 +02:00
parent d6e167d16e
commit 7595465c21
2 changed files with 36 additions and 12 deletions

View File

@@ -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> validator) {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
postProcessor.setValidatorProvider(validator);
return postProcessor;
}
}
}