diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java index 651259e6a5d..9c5a90cd87d 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.java @@ -285,8 +285,9 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter ConstraintValidatorFactory targetConstraintValidatorFactory = this.constraintValidatorFactory; if (targetConstraintValidatorFactory == null && this.applicationContext != null) { - targetConstraintValidatorFactory = - new SpringConstraintValidatorFactory(this.applicationContext.getAutowireCapableBeanFactory()); + targetConstraintValidatorFactory = new SpringConstraintValidatorFactory( + this.applicationContext.getAutowireCapableBeanFactory(), + configuration.getDefaultConstraintValidatorFactory()); } if (targetConstraintValidatorFactory != null) { configuration.constraintValidatorFactory(targetConstraintValidatorFactory); diff --git a/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringConstraintValidatorFactory.java b/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringConstraintValidatorFactory.java index f46bd7dfd53..8e163cef3a0 100644 --- a/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringConstraintValidatorFactory.java +++ b/spring-context/src/main/java/org/springframework/validation/beanvalidation/SpringConstraintValidatorFactory.java @@ -18,6 +18,7 @@ package org.springframework.validation.beanvalidation; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorFactory; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.util.Assert; @@ -40,6 +41,8 @@ public class SpringConstraintValidatorFactory implements ConstraintValidatorFact private final AutowireCapableBeanFactory beanFactory; + private final @Nullable ConstraintValidatorFactory defaultConstraintValidatorFactory; + /** * Create a new SpringConstraintValidatorFactory for the given BeanFactory. @@ -48,11 +51,35 @@ public class SpringConstraintValidatorFactory implements ConstraintValidatorFact public SpringConstraintValidatorFactory(AutowireCapableBeanFactory beanFactory) { Assert.notNull(beanFactory, "BeanFactory must not be null"); this.beanFactory = beanFactory; + this.defaultConstraintValidatorFactory = null; + } + + /** + * Create a new SpringConstraintValidatorFactory for the given BeanFactory. + * @param beanFactory the target BeanFactory + * @param defaultConstraintValidatorFactory the default ConstraintValidatorFactory + * as exposed by the validation provider (for creating provider-internal validator + * implementations which might not be publicly accessible in a module path setup) + * @since 7.0.3 + */ + public SpringConstraintValidatorFactory( + AutowireCapableBeanFactory beanFactory, ConstraintValidatorFactory defaultConstraintValidatorFactory) { + + Assert.notNull(beanFactory, "BeanFactory must not be null"); + this.beanFactory = beanFactory; + this.defaultConstraintValidatorFactory = defaultConstraintValidatorFactory; } @Override public > T getInstance(Class key) { + if (this.defaultConstraintValidatorFactory != null) { + // Create provider-internal validator implementations through default ConstraintValidatorFactory. + String providerModuleName = this.defaultConstraintValidatorFactory.getClass().getModule().getName(); + if (providerModuleName != null && providerModuleName.equals(key.getModule().getName())) { + return this.defaultConstraintValidatorFactory.getInstance(key); + } + } return this.beanFactory.createBean(key); }