Polishing contribution

Closes gh-33105
This commit is contained in:
rstoyanchev
2024-06-28 15:32:43 +01:00
parent 976b4f3533
commit c74666a883

View File

@@ -23,13 +23,14 @@ import java.lang.reflect.Method;
import jakarta.validation.ConstraintViolationException;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.groups.Default;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.beans.MutablePropertyValues;
@@ -47,7 +48,6 @@ import org.springframework.scheduling.annotation.AsyncAnnotationAdvisor;
import org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.function.SingletonSupplier;
import org.springframework.validation.annotation.Validated;
import org.springframework.validation.method.MethodValidationException;
@@ -63,63 +63,44 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
*/
class MethodValidationProxyTests {
@Test
@ParameterizedTest
@ValueSource(booleans = {true, false})
@SuppressWarnings("unchecked")
public void testMethodValidationInterceptor() {
void testMethodValidationInterceptor(boolean adaptViolations) {
MyValidBean bean = new MyValidBean();
ProxyFactory factory = new ProxyFactory(bean);
factory.addAdvice(new MethodValidationInterceptor());
factory.addAdvice(adaptViolations ?
new MethodValidationInterceptor(() -> Validation.buildDefaultValidatorFactory().getValidator(), true) :
new MethodValidationInterceptor());
factory.addAdvisor(new AsyncAnnotationAdvisor());
doTestProxyValidation((MyValidInterface<String>) factory.getProxy(), ConstraintViolationException.class);
doTestProxyValidation((MyValidInterface<String>) factory.getProxy(),
(adaptViolations ? MethodValidationException.class : ConstraintViolationException.class));
}
@Test
@ParameterizedTest
@ValueSource(booleans = {true, false})
@SuppressWarnings("unchecked")
public void testMethodValidationInterceptorWithAdaptConstraintViolations() {
MyValidBean bean = new MyValidBean();
ProxyFactory factory = new ProxyFactory(bean);
try (ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory()) {
factory.addAdvice(new MethodValidationInterceptor(SingletonSupplier.of(validatorFactory.getValidator()), true));
factory.addAdvisor(new AsyncAnnotationAdvisor());
doTestProxyValidation((MyValidInterface<String>) factory.getProxy(), MethodValidationException.class);
}
}
@Test
@SuppressWarnings("unchecked")
public void testMethodValidationPostProcessor() {
void testMethodValidationPostProcessor(boolean adaptViolations) {
StaticApplicationContext context = new StaticApplicationContext();
context.registerSingleton("mvpp", MethodValidationPostProcessor.class);
context.registerBean(MethodValidationPostProcessor.class, adaptViolations ?
() -> {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
postProcessor.setAdaptConstraintViolations(true);
return postProcessor;
} :
MethodValidationPostProcessor::new);
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("beforeExistingAdvisors", false);
context.registerSingleton("aapp", AsyncAnnotationBeanPostProcessor.class, pvs);
context.registerSingleton("bean", MyValidBean.class);
context.refresh();
doTestProxyValidation(context.getBean("bean", MyValidInterface.class), ConstraintViolationException.class);
context.close();
}
@Test
@SuppressWarnings("unchecked")
public void testMethodValidationPostProcessorWithAdaptConstraintViolations() {
StaticApplicationContext context = new StaticApplicationContext();
context.registerBean(MethodValidationPostProcessor.class, () -> {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
postProcessor.setAdaptConstraintViolations(true);
return postProcessor;
});
MutablePropertyValues pvs = new MutablePropertyValues();
pvs.add("beforeExistingAdvisors", false);
context.registerSingleton("aapp", AsyncAnnotationBeanPostProcessor.class, pvs);
context.registerSingleton("bean", MyValidBean.class);
context.refresh();
doTestProxyValidation(context.getBean("bean", MyValidInterface.class), MethodValidationException.class);
doTestProxyValidation(context.getBean("bean", MyValidInterface.class),
adaptViolations ? MethodValidationException.class : ConstraintViolationException.class);
context.close();
}
@Test // gh-29782
public void testMethodValidationPostProcessorForInterfaceOnlyProxy() {
void testMethodValidationPostProcessorForInterfaceOnlyProxy() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(MethodValidationPostProcessor.class);
context.registerBean(MyValidInterface.class, () ->
@@ -129,23 +110,6 @@ class MethodValidationProxyTests {
context.close();
}
@Test
@SuppressWarnings("unchecked")
public void testMethodValidationPostProcessorForInterfaceOnlyProxyWithAdaptConstraintViolations() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.registerBean(MethodValidationPostProcessor.class, () -> {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
postProcessor.setAdaptConstraintViolations(true);
return postProcessor;
});
context.registerBean(MyValidInterface.class, () ->
ProxyFactory.getProxy(MyValidInterface.class, new MyValidClientInterfaceMethodInterceptor()));
context.refresh();
doTestProxyValidation(context.getBean(MyValidInterface.class), MethodValidationException.class);
context.close();
}
@SuppressWarnings("DataFlowIssue")
private void doTestProxyValidation(MyValidInterface<String> proxy, Class<? extends Exception> expectedExceptionClass) {
assertThat(proxy.myValidMethod("value", 5)).isNotNull();
@@ -174,11 +138,6 @@ class MethodValidationProxyTests {
doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithValidatorProvider.class);
}
@Test
void testLazyValidatorForMethodValidationWithAdaptConstraintViolations() {
doTestLazyValidatorForMethodValidation(LazyMethodValidationConfigWithAdaptConstraintViolations.class);
}
private void doTestLazyValidatorForMethodValidation(Class<?> configClass) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(configClass, CustomValidatorBean.class, MyValidBean.class, MyValidFactoryBean.class);
@@ -335,16 +294,4 @@ class MethodValidationProxyTests {
}
}
@Configuration
public static class LazyMethodValidationConfigWithAdaptConstraintViolations {
@Bean
public static MethodValidationPostProcessor methodValidationPostProcessor(ObjectProvider<Validator> validator) {
MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
postProcessor.setValidatorProvider(validator);
postProcessor.setAdaptConstraintViolations(true);
return postProcessor;
}
}
}