Skip to content

Commit eb6b151

Browse files
zpavloudiswilkinsona
authored andcommitted
Support unwrapping in ValidatorAdapter
See gh-37119
1 parent 0242ba8 commit eb6b151

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java

+14
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
*
4040
* @author Stephane Nicoll
4141
* @author Phillip Webb
42+
* @author Zisis Pavloudis
4243
* @since 2.0.0
4344
*/
4445
public class ValidatorAdapter implements SmartValidator, ApplicationContextAware, InitializingBean, DisposableBean {
@@ -153,4 +154,17 @@ private static Validator wrap(Validator validator, boolean existingBean) {
153154
return validator;
154155
}
155156

157+
@Override
158+
@SuppressWarnings("unchecked")
159+
public <T> T unwrap(Class<T> type) {
160+
if (type.isAssignableFrom(this.target.getClass())) {
161+
if (this.target instanceof SpringValidatorAdapter adapter) {
162+
return adapter.unwrap(type);
163+
}
164+
return (T) this.target;
165+
}
166+
167+
throw new IllegalArgumentException("Cannot unwrap " + this.target + " to " + type.getName());
168+
}
169+
156170
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapterTests.java

+12
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818

1919
import java.util.HashMap;
2020

21+
import jakarta.validation.Validator;
2122
import jakarta.validation.constraints.Min;
23+
import org.hibernate.validator.HibernateValidator;
24+
import org.junit.jupiter.api.Assertions;
2225
import org.junit.jupiter.api.Test;
2326

2427
import org.springframework.boot.test.context.FilteredClassLoader;
@@ -91,6 +94,15 @@ void wrapperWhenValidationProviderNotPresentShouldNotThrowException() {
9194
.run((context) -> ValidatorAdapter.get(context, null));
9295
}
9396

97+
@Test
98+
void unwrapValidatorInstanceOfJakartaTypeAndExceptionThrownWhenTypeNotSupported() {
99+
this.contextRunner.withUserConfiguration(LocalValidatorFactoryBeanConfig.class).run((context) -> {
100+
ValidatorAdapter wrapper = context.getBean(ValidatorAdapter.class);
101+
assertThat(wrapper.unwrap(Validator.class)).isInstanceOf(Validator.class);
102+
Assertions.assertThrows(IllegalArgumentException.class, () -> wrapper.unwrap(HibernateValidator.class));
103+
});
104+
}
105+
94106
@Configuration(proxyBeanMethods = false)
95107
static class LocalValidatorFactoryBeanConfig {
96108

0 commit comments

Comments
 (0)