Skip to content

Commit 7595465

Browse files
committed
Lazily obtain Validator from original Supplier
Closes gh-31137
1 parent d6e167d commit 7595465

File tree

2 files changed

+36
-12
lines changed

2 files changed

+36
-12
lines changed

spring-context/src/main/java/org/springframework/validation/beanvalidation/MethodValidationAdapter.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ public MethodValidationAdapter(Supplier<Validator> validator) {
133133
}
134134

135135
private static Supplier<SpringValidatorAdapter> initValidatorAdapter(Supplier<Validator> validatorSupplier) {
136-
Validator validator = validatorSupplier.get();
137-
return (validator instanceof SpringValidatorAdapter validatorAdapter ?
138-
(() -> validatorAdapter) : SingletonSupplier.of(() -> new SpringValidatorAdapter(validator)));
136+
return SingletonSupplier.of(() -> {
137+
Validator validator = validatorSupplier.get();
138+
return (validator instanceof SpringValidatorAdapter sva ? sva : new SpringValidatorAdapter(validator));
139+
});
139140
}
140141

141142

spring-context/src/test/java/org/springframework/validation/beanvalidation/MethodValidationProxyTests.java

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.springframework.aop.framework.ProxyFactory;
3333
import org.springframework.beans.MutablePropertyValues;
3434
import org.springframework.beans.factory.FactoryBean;
35+
import org.springframework.beans.factory.ObjectProvider;
3536
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3637
import org.springframework.context.annotation.Bean;
3738
import org.springframework.context.annotation.Configuration;
@@ -54,7 +55,7 @@
5455
* and/or {@link MethodValidationPostProcessor}.
5556
*
5657
* @author Juergen Hoeller
57-
* @author Rossen Stoyanchevß
58+
* @author Rossen Stoyanchev
5859
*/
5960
public class MethodValidationProxyTests {
6061

@@ -109,19 +110,29 @@ private void doTestProxyValidation(MyValidInterface<String> proxy) {
109110

110111
@Test
111112
public void testLazyValidatorForMethodValidation() {
112-
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
113-
LazyMethodValidationConfig.class, CustomValidatorBean.class,
114-
MyValidBean.class, MyValidFactoryBean.class);
115-
context.getBeansOfType(MyValidInterface.class).values().forEach(bean -> bean.myValidMethod("value", 5));
116-
context.close();
113+
doTestLazyValidatorForMethodValidation(LazyMethodValidationConfig.class);
117114
}
118115

119116
@Test
120117
public void testLazyValidatorForMethodValidationWithProxyTargetClass() {
121-
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
122-
LazyMethodValidationConfigWithProxyTargetClass.class, CustomValidatorBean.class,
123-
MyValidBean.class, MyValidFactoryBean.class);
118+
doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithProxyTargetClass.class);
119+
}
120+
121+
@Test
122+
public void testLazyValidatorForMethodValidationWithValidatorProvider() {
123+
doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithValidatorProvider.class);
124+
}
125+
126+
private void doTestLazyValidatorForMethodValidation(Class<?> configClass) {
127+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
128+
context.register(configClass, CustomValidatorBean.class, MyValidBean.class, MyValidFactoryBean.class);
129+
context.getDefaultListableBeanFactory().getBeanDefinition("customValidatorBean").setLazyInit(true);
130+
context.refresh();
131+
132+
assertThat(context.getDefaultListableBeanFactory().containsSingleton("customValidatorBean")).isFalse();
124133
context.getBeansOfType(MyValidInterface.class).values().forEach(bean -> bean.myValidMethod("value", 5));
134+
assertThat(context.getDefaultListableBeanFactory().containsSingleton("customValidatorBean")).isTrue();
135+
125136
context.close();
126137
}
127138

@@ -256,4 +267,16 @@ public static MethodValidationPostProcessor methodValidationPostProcessor(@Lazy
256267
}
257268
}
258269

270+
271+
@Configuration
272+
public static class LazyMethodValidationConfigWithValidatorProvider {
273+
274+
@Bean
275+
public static MethodValidationPostProcessor methodValidationPostProcessor(ObjectProvider<Validator> validator) {
276+
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
277+
postProcessor.setValidatorProvider(validator);
278+
return postProcessor;
279+
}
280+
}
281+
259282
}

0 commit comments

Comments
 (0)