From e2ad9b9b7444e402ebec246f2741ed70c95adb1f Mon Sep 17 00:00:00 2001 From: agrancaric Date: Tue, 13 Feb 2024 14:14:49 +0100 Subject: [PATCH] Add support for programmatically registered constraints on hibernate entites by registering Spring's validator with Hibernate BeanValidationEventListener --- .../NrichValidationAutoConfiguration.java | 10 ++++++++++ .../NrichValidationAutoConfigurationTest.java | 15 +++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/nrich-validation-spring-boot-starter/src/main/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfiguration.java b/nrich-validation-spring-boot-starter/src/main/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfiguration.java index 9df84ded..4b505446 100644 --- a/nrich-validation-spring-boot-starter/src/main/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfiguration.java +++ b/nrich-validation-spring-boot-starter/src/main/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfiguration.java @@ -22,13 +22,16 @@ import net.croz.nrich.validation.constraint.mapping.DefaultConstraintValidatorRegistrar; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; import org.springframework.boot.autoconfigure.validation.ValidationConfigurationCustomizer; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.AbstractResourceBasedMessageSource; +import jakarta.validation.Validator; import java.util.List; @Configuration(proxyBeanMethods = false) @@ -66,4 +69,11 @@ ConstraintValidatorRegistrar constraintMappingRegistrar(@Value("${nrich.validati ValidationConfigurationCustomizer validationConfigurationCustomizer(ConstraintValidatorRegistrar constraintValidatorRegistrar) { return constraintValidatorRegistrar::registerConstraintValidators; } + + @ConditionalOnBean(Validator.class) + @ConditionalOnProperty(name = "nrich.validation.register-constraint-validators", havingValue = "true", matchIfMissing = true) + @Bean + HibernatePropertiesCustomizer validationHibernatePropertiesCustomizer(Validator validator) { + return hibernateProperties -> hibernateProperties.put("jakarta.persistence.validation.factory", validator); + } } diff --git a/nrich-validation-spring-boot-starter/src/test/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfigurationTest.java b/nrich-validation-spring-boot-starter/src/test/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfigurationTest.java index 35f972ad..4dc1674f 100644 --- a/nrich-validation-spring-boot-starter/src/test/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfigurationTest.java +++ b/nrich-validation-spring-boot-starter/src/test/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfigurationTest.java @@ -20,10 +20,12 @@ import net.croz.nrich.validation.api.mapping.ConstraintValidatorRegistrar; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; import org.springframework.boot.autoconfigure.validation.ValidationConfigurationCustomizer; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.MessageSource; import org.springframework.context.support.AbstractResourceBasedMessageSource; +import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -37,11 +39,16 @@ class NrichValidationAutoConfigurationTest { void shouldConfigureDefaultConfiguration() { // expect contextRunner.run(context -> { - assertThat(context).hasSingleBean(NrichValidationAutoConfiguration.ValidationMessageSourceRegistrar.class); + assertThat(context).hasSingleBean(NrichValidationAutoConfiguration.ValidationMessageSourceRegistrar.class); assertThat(context).hasSingleBean(ConstraintValidatorRegistrar.class); - assertThat(context).hasSingleBean(ValidationConfigurationCustomizer.class); - } - ); + assertThat(context).hasSingleBean(ValidationConfigurationCustomizer.class); + }); + } + + @Test + void shouldRegisterValidationPropertiesCustomizer() { + // expect + contextRunner.withBean(LocalValidatorFactoryBean.class).run(context -> assertThat(context).hasSingleBean(HibernatePropertiesCustomizer.class)); } @Test