Spring Boot Eager 初始化 ConstraintValidator Beans

问题描述 投票:0回答:1

为什么我们看到与内置和自定义验证器相关的

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-validator spring-validator
1个回答
0
投票

正如 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...
        };
    }

}

© www.soinside.com 2019 - 2024. All rights reserved.