Support unwrapping in ValidatorAdapter

See gh-37119
This commit is contained in:
Zisis Pavloudis
2023-08-28 20:22:32 +03:00
committed by Andy Wilkinson
parent 0242ba8a13
commit eb6b151c41
2 changed files with 26 additions and 0 deletions

View File

@@ -39,6 +39,7 @@ import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
*
* @author Stephane Nicoll
* @author Phillip Webb
* @author Zisis Pavloudis
* @since 2.0.0
*/
public class ValidatorAdapter implements SmartValidator, ApplicationContextAware, InitializingBean, DisposableBean {
@@ -153,4 +154,17 @@ public class ValidatorAdapter implements SmartValidator, ApplicationContextAware
return validator;
}
@Override
@SuppressWarnings("unchecked")
public <T> T unwrap(Class<T> type) {
if (type.isAssignableFrom(this.target.getClass())) {
if (this.target instanceof SpringValidatorAdapter adapter) {
return adapter.unwrap(type);
}
return (T) this.target;
}
throw new IllegalArgumentException("Cannot unwrap " + this.target + " to " + type.getName());
}
}

View File

@@ -18,7 +18,10 @@ package org.springframework.boot.autoconfigure.validation;
import java.util.HashMap;
import jakarta.validation.Validator;
import jakarta.validation.constraints.Min;
import org.hibernate.validator.HibernateValidator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.FilteredClassLoader;
@@ -91,6 +94,15 @@ class ValidatorAdapterTests {
.run((context) -> ValidatorAdapter.get(context, null));
}
@Test
void unwrapValidatorInstanceOfJakartaTypeAndExceptionThrownWhenTypeNotSupported() {
this.contextRunner.withUserConfiguration(LocalValidatorFactoryBeanConfig.class).run((context) -> {
ValidatorAdapter wrapper = context.getBean(ValidatorAdapter.class);
assertThat(wrapper.unwrap(Validator.class)).isInstanceOf(Validator.class);
Assertions.assertThrows(IllegalArgumentException.class, () -> wrapper.unwrap(HibernateValidator.class));
});
}
@Configuration(proxyBeanMethods = false)
static class LocalValidatorFactoryBeanConfig {