From e642cadadd12fbee4b4c1ba73ade1a225d9c2b0a Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 2 Oct 2024 12:14:00 +0200 Subject: [PATCH] GH-2974 Fix validation when only 'default' properties are used Resolves #2974 --- .../AbstractExtendedBindingProperties.java | 81 ++++++++++++++++--- 1 file changed, 70 insertions(+), 11 deletions(-) diff --git a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractExtendedBindingProperties.java b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractExtendedBindingProperties.java index a4bb0d0ae..5ce367791 100644 --- a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractExtendedBindingProperties.java +++ b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractExtendedBindingProperties.java @@ -20,16 +20,24 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.boot.context.properties.bind.PropertySourcesPlaceholdersResolver; -import org.springframework.boot.context.properties.source.ConfigurationPropertySources; +import org.springframework.boot.context.properties.bind.validation.ValidationBindHandler; +import org.springframework.boot.validation.MessageInterpolatorFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.support.GenericApplicationContext; +import org.springframework.util.ClassUtils; +import org.springframework.validation.Errors; +import org.springframework.validation.Validator; +import org.springframework.validation.annotation.Validated; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; /** * Base implementation of {@link ExtendedBindingProperties}. * @@ -39,9 +47,12 @@ import org.springframework.context.support.GenericApplicationContext; * @author Oleg Zhurakousky * @since 2.1 */ +@Validated public abstract class AbstractExtendedBindingProperties implements ExtendedBindingProperties, ApplicationContextAware { + static Log logger = LogFactory.getLog(AbstractExtendedBindingProperties.class); + private final Map bindings = new HashMap<>(); private ConfigurableApplicationContext applicationContext = new GenericApplicationContext(); @@ -83,16 +94,18 @@ public abstract class AbstractExtendedBindingProperties type) { + return this.delegate.supports(type); + } + + @Override + public void validate(Object target, Errors errors) { + this.delegate.validate(target, errors); + } + + static boolean isJsr303Present(ApplicationContext applicationContext) { + ClassLoader classLoader = applicationContext.getClassLoader(); + for (String validatorClass : VALIDATOR_CLASSES) { + if (!ClassUtils.isPresent(validatorClass, classLoader)) { + return false; + } + } + return true; + } + + private static class Delegate extends LocalValidatorFactoryBean { + + Delegate(ApplicationContext applicationContext) { + setApplicationContext(applicationContext); + setMessageInterpolator(new MessageInterpolatorFactory(applicationContext).getObject()); + try { + afterPropertiesSet(); + } + catch (Exception e) { + logger.warn("Failed to execute afterPropertiesSet() on aplication context", e); + } + } + + } + } }