Polishing contribution
Closes gh-33105
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user