From 284cf3ecf2492f5c8e8df15af8103bbc27e05571 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 24 Nov 2022 12:01:51 +0100 Subject: [PATCH] Rely on standard parameter name resolution in Bean Validation 3.0 Just configuring additional Kotlin reflection if Kotlin is present. Closes gh-29566 --- .../LocalValidatorFactoryBean.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) 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 9aa5135e1dc..d6b164367f7 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 @@ -49,7 +49,8 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.MessageSource; -import org.springframework.core.DefaultParameterNameDiscoverer; +import org.springframework.core.KotlinDetector; +import org.springframework.core.KotlinReflectionParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.io.Resource; import org.springframework.lang.Nullable; @@ -100,7 +101,7 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter private ConstraintValidatorFactory constraintValidatorFactory; @Nullable - private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer(); + private ParameterNameDiscoverer parameterNameDiscoverer; @Nullable private Resource[] mappingLocations; @@ -117,6 +118,13 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter private ValidatorFactory validatorFactory; + public LocalValidatorFactoryBean() { + if (KotlinDetector.isKotlinReflectPresent()) { + this.parameterNameDiscoverer = new KotlinReflectionParameterNameDiscoverer(); + } + } + + /** * Specify the desired provider class, if any. *

If not specified, JSR-303's default search mechanism will be used. @@ -188,7 +196,10 @@ public class LocalValidatorFactoryBean extends SpringValidatorAdapter /** * Set the ParameterNameDiscoverer to use for resolving method and constructor * parameter names if needed for message interpolation. - *

Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}. + *

Default is Hibernate Validator's own internal use of standard Java reflection, + * with an additional {@link KotlinReflectionParameterNameDiscoverer} if Kotlin + * is present. This may be overridden with a custom subclass or a Spring-controlled + * {@link org.springframework.core.DefaultParameterNameDiscoverer} if necessary, */ public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) { this.parameterNameDiscoverer = parameterNameDiscoverer;