gpt4 book ai didi

java - Spring Boot 中的 Hibernate Validator 使用不同的 ConstraintValidatorManager

转载 作者:太空宇宙 更新时间:2023-11-04 09:35:46 26 4
gpt4 key购买 nike

我遇到了之前在 Spring Boot 与 Hibernate 验证中提到过的问题,其中自定义约束 validator 内的依赖项 Autowiring 不起作用。从我自己的调试中,我注意到,当发生实体级验证时,与 Hibernate 为表单提交执行 bean 验证时相比,Hibernate 会加载不同的 ConstraintValidatorManager。后者工作正常,前者导致自定义约束 validator 的依赖项为空。看起来 Hibernate 正在从根上下文加载一个管理器,并从 servlet 上下文加载一个管理器。这可以解释 Hibernate 不知道自定义约束 validator 中 Autowiring 的依赖项的存在。然而,如果这是真的,我不明白发生了什么,也不明白如何让 Hibernate/JPA 知道 Spring 上下文及其 bean。

我希望有人能指出我正确的方向?我已经尝试了以下所有答案,以及更多答案(例如不同的库版本、配置方法、通过 utils 类加载静态 bean 等):

Inject Repository inside ConstraintValidator with Spring 4 and message interpolation configuration

Autowired gives Null value in Custom Constraint validator

此外,我还专门阅读了 Spring Boot 引用指南好几次,但运气不佳。有几个案例提到他们的 Hibernate 验证工作正常,无论是对于常规 bean 提交还是在实体持久期间。不幸的是,我似乎无法检索他们使用的确切(Java)配置,但他们似乎正在使用默认配置。我开始怀疑这是否是一个特定的 Spring Boot 问题(尽管据说 Spring Validation 和 Hibernate Validation 的组合应该可以开箱即用)。

添加类似下面的 bean 并不能解决问题(当然默认工厂是 SpringConstraintValidatorFactory):

@Bean
public LocalValidatorFactoryBean validator()
{
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}

也不包含 Hibernate validator 的 bean 定义:

Autowired gives Null value in Custom Constraint validator

有许多不同的方法可以加载和注入(inject)所需的 bean,但是如果 Hibernate 根本不知道上下文中加载的 bean(因为它使用的是不同的上下文?),如何进行?

提前致谢。

更新:Gradle 文件

buildscript {
ext {
springBootVersion = '2.1.5.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = '<hidden>'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
mavenCentral()
jcenter()
}

dependencies {
implementation('org.springframework.boot:spring-boot-starter-web')
implementation('org.springframework.boot:spring-boot-starter-tomcat:2.1.5.RELEASE')

implementation('org.springframework.boot:spring-boot-starter-thymeleaf')
implementation('org.springframework.boot:spring-boot-starter-security')
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation('org.springframework.boot:spring-boot-starter-mail')
implementation('org.springframework.session:spring-session-core')

annotationProcessor('org.springframework.boot:spring-boot-configuration-processor')

implementation('org.postgresql:postgresql')

// https://mvnrepository.com/artifact/org.jboss.aerogear/aerogear-otp-java
implementation('org.jboss.aerogear:aerogear-otp-java:1.0.0')

implementation('com.github.mkopylec:recaptcha-spring-boot-starter:2.2.0')
implementation('nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:2.0.5')
implementation('org.thymeleaf.extras:thymeleaf-extras-springsecurity3:3.0.4.RELEASE')

implementation('javax.enterprise:cdi-api:2.0')

runtimeOnly('org.springframework.boot:spring-boot-devtools')

testImplementation('org.springframework.boot:spring-boot-starter-test')
testImplementation('org.springframework.security:spring-security-test')
testImplementation 'org.mockito:mockito-core:2.27.0'
}

最佳答案

有一种方法可以通过设置javax.persistence.validation.factory来告诉Hibernate使用相同的 validator

@Configuration
@Lazy
class SpringValidatorConfiguration {

@Bean
@Lazy
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(final Validator validator) {
return new HibernatePropertiesCustomizer() {

@Override
public void customize(Map<String, Object> hibernateProperties) {
hibernateProperties.put("javax.persistence.validation.factory", validator);
}
};
}
}

这样一切就都正常了。

关于java - Spring Boot 中的 Hibernate Validator 使用不同的 ConstraintValidatorManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56542699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com