From fd16ae78424bfce31439cc0fc67005cf7d14dba3 Mon Sep 17 00:00:00 2001 From: Zisis Pavloudis <25851168+zpavloudis@users.noreply.github.com> Date: Mon, 28 Aug 2023 20:22:32 +0300 Subject: [PATCH 1/2] Unwrap a validator instance of specified type contained in SpringValidatorAdapter See gh-37081. --- .../validation/ValidatorAdapter.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java index 84bd614b1838..7d8cca93d5c3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java @@ -39,6 +39,7 @@ * * @author Stephane Nicoll * @author Phillip Webb + * @author Zisis Pavloudis * @since 2.0.0 */ public class ValidatorAdapter implements SmartValidator, ApplicationContextAware, InitializingBean, DisposableBean { @@ -153,4 +154,20 @@ private static Validator wrap(Validator validator, boolean existingBean) { return validator; } + @Override + @SuppressWarnings("unchecked") + public T unwrap(Class type) { + if (this.target == null) { + return null; + } + if (type.isAssignableFrom(this.target.getClass())) { + if (this.target instanceof SpringValidatorAdapter adapter) { + return adapter.unwrap(type); + } + return (T) this.target; + } + + throw new ValidationException("Cannot unwrap to " + type); + } + } From d0b461786cbcc341d534e46e228f21e9783e308b Mon Sep 17 00:00:00 2001 From: Zisis Pavloudis <25851168+zpavloudis@users.noreply.github.com> Date: Tue, 5 Sep 2023 01:11:12 +0300 Subject: [PATCH 2/2] Polish "Unwrap a validator instance of specified type contained in SpringValidatorAdapter" See gh-37081. --- .../autoconfigure/validation/ValidatorAdapter.java | 5 +---- .../validation/ValidatorAdapterTests.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java index 7d8cca93d5c3..9e175774017c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapter.java @@ -157,9 +157,6 @@ private static Validator wrap(Validator validator, boolean existingBean) { @Override @SuppressWarnings("unchecked") public T unwrap(Class type) { - if (this.target == null) { - return null; - } if (type.isAssignableFrom(this.target.getClass())) { if (this.target instanceof SpringValidatorAdapter adapter) { return adapter.unwrap(type); @@ -167,7 +164,7 @@ public T unwrap(Class type) { return (T) this.target; } - throw new ValidationException("Cannot unwrap to " + type); + throw new IllegalArgumentException("Cannot unwrap " + this.target + " to " + type.getName()); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapterTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapterTests.java index bf57084b98ef..2230b94d612f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapterTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/validation/ValidatorAdapterTests.java @@ -18,7 +18,10 @@ 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 @@ void wrapperWhenValidationProviderNotPresentShouldNotThrowException() { .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 {