为什么我们看到与内置和自定义验证器相关的
Spring
Bean 仅在第一个请求期间初始化。是否可以更改此行为以在 Spring Boot v3.3.2
中作为应用程序启动的一部分进行初始化?
[2m2024-08-20T21:44:57.194+04:00[[TRACE[[7332[[2m---[[2m[web-webflux-trace] [nio-8080-exec-1][[2m[66c4d6192e5a47bbf7d8544f82d25b53-f7d8544f82d25b53] [0;39m[36mo.s.b.f.s.DefaultListableBeanFactory [[2m:[Creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.NotBlankValidator'
[2m2024-08-20T21:44:57.194+04:00[[TRACE[[7332[[2m---[[2m[web-webflux-trace] [nio-8080-exec-1][[2m[66c4d6192e5a47bbf7d8544f82d25b53-f7d8544f82d25b53] [0;39m[36mo.s.b.f.s.DefaultListableBeanFactory [[2m:[Finished creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.NotBlankValidator'
[2m2024-08-20T21:44:57.194+04:00[[TRACE[[7332[[2m---[[2m[web-webflux-trace] [nio-8080-exec-1][[2m[66c4d6192e5a47bbf7d8544f82d25b53-f7d8544f82d25b53] [0;39m[36mo.s.b.f.s.DefaultListableBeanFactory [[2m:[Creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.PatternValidator'
[2m2024-08-20T21:44:57.194+04:00[[TRACE[[7332[[2m---[[2m[web-webflux-trace] [nio-8080-exec-1][[2m[66c4d6192e5a47bbf7d8544f82d25b53-f7d8544f82d25b53] [0;39m[36mo.s.b.f.s.DefaultListableBeanFactory [[2m:[Finished creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.PatternValidator'
正如 Spring 框架和 Hibernate 验证问题所讨论的,运行时可用的资源非常低(100mCPU),因此资源的延迟初始化可能会导致第一个请求的额外延迟。
在这里,您可能应该在 Spring Boot 中使用
ApplicationRunner
急切地初始化约束的加载 - 此类组件在启动期间执行,然后应用程序在活动端点上声明自己“活动”。
据我所知,Spring 无法在启动时自动检测应用程序中要验证的所有类型。您必须在跑步者中列出尽可能多的内容,如下所示:
package io.spring.sample;
import jakarta.validation.Validator;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class SampleConfiguratoin {
@Bean
ApplicationRunner hibernateValidationInitializer(Validator validator) {
return (args) -> {
validator.getConstraintsForClass(YourDomainObject.class);
// other getConstraintsForClass calls...
};
}
}