Skip to content

Commit ae90b1a

Browse files
committed
Add support for programmatically registered constraints on hibernate entites by registering Spring's validator with Hibernate BeanValidationEventListener
1 parent 4f084aa commit ae90b1a

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

nrich-validation-spring-boot-starter/src/main/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfiguration.java

+10
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@
2222
import net.croz.nrich.validation.constraint.mapping.DefaultConstraintValidatorRegistrar;
2323
import org.springframework.beans.factory.InitializingBean;
2424
import org.springframework.beans.factory.annotation.Value;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
27+
import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
2628
import org.springframework.boot.autoconfigure.validation.ValidationConfigurationCustomizer;
2729
import org.springframework.context.MessageSource;
2830
import org.springframework.context.annotation.Bean;
2931
import org.springframework.context.annotation.Configuration;
3032
import org.springframework.context.support.AbstractResourceBasedMessageSource;
3133

34+
import jakarta.validation.Validator;
3235
import java.util.List;
3336

3437
@Configuration(proxyBeanMethods = false)
@@ -66,4 +69,11 @@ ConstraintValidatorRegistrar constraintMappingRegistrar(@Value("${nrich.validati
6669
ValidationConfigurationCustomizer validationConfigurationCustomizer(ConstraintValidatorRegistrar constraintValidatorRegistrar) {
6770
return constraintValidatorRegistrar::registerConstraintValidators;
6871
}
72+
73+
@ConditionalOnBean(Validator.class)
74+
@ConditionalOnProperty(name = "nrich.validation.register-constraint-validators", havingValue = "true", matchIfMissing = true)
75+
@Bean
76+
HibernatePropertiesCustomizer validationHibernatePropertiesCustomizer(Validator validator) {
77+
return hibernateProperties -> hibernateProperties.put("jakarta.persistence.validation.factory", validator);
78+
}
6979
}

nrich-validation-spring-boot-starter/src/test/java/net/croz/nrich/validation/starter/configuration/NrichValidationAutoConfigurationTest.java

+11-4
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import net.croz.nrich.validation.api.mapping.ConstraintValidatorRegistrar;
2121
import org.junit.jupiter.api.Test;
2222
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
2324
import org.springframework.boot.autoconfigure.validation.ValidationConfigurationCustomizer;
2425
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2526
import org.springframework.context.MessageSource;
2627
import org.springframework.context.support.AbstractResourceBasedMessageSource;
28+
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
2729

2830
import static org.assertj.core.api.Assertions.assertThat;
2931
import static org.mockito.Mockito.mock;
@@ -37,11 +39,16 @@ class NrichValidationAutoConfigurationTest {
3739
void shouldConfigureDefaultConfiguration() {
3840
// expect
3941
contextRunner.run(context -> {
40-
assertThat(context).hasSingleBean(NrichValidationAutoConfiguration.ValidationMessageSourceRegistrar.class);
42+
assertThat(context).hasSingleBean(NrichValidationAutoConfiguration.ValidationMessageSourceRegistrar.class);
4143
assertThat(context).hasSingleBean(ConstraintValidatorRegistrar.class);
42-
assertThat(context).hasSingleBean(ValidationConfigurationCustomizer.class);
43-
}
44-
);
44+
assertThat(context).hasSingleBean(ValidationConfigurationCustomizer.class);
45+
});
46+
}
47+
48+
@Test
49+
void shouldRegisterValidationPropertiesCustomizer() {
50+
// expect
51+
contextRunner.withBean(LocalValidatorFactoryBean.class).run(context -> assertThat(context).hasSingleBean(HibernatePropertiesCustomizer.class));
4552
}
4653

4754
@Test

0 commit comments

Comments
 (0)