springhibernate-validatorspring-validator

Spring Boot Eager Initialize ConstraintValidator Beans


Why do we see the Spring Beans related to Inbuilt and Custom validators initialized ONLY during the first request. Can this behavior be changed to initialize as part of the application startup in 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'

Solution

  • Have you tried creating a custom validator bean using SpringValidatorAdapter? I tested this in one of my apps. Without the custom validator bean, I did see the Hibernate validator bean initialization logs on the first request. Didn't see those logs when I defined a custom validator bean.

    Bean definition:

    import io.github.devatherock.emailsender.model.EmailSendRequest;
    
    import jakarta.validation.Validation;
    import jakarta.validation.Validator;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.validation.beanvalidation.SpringValidatorAdapter;
    
    @Configuration
    public class EmailSenderAppConfig {
        
        @Bean
        public SpringValidatorAdapter validator() {
            Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
            validator.getConstraintsForClass(EmailSendRequest.class);
    
            return new SpringValidatorAdapter(validator);
        }
    }
    

    First request logs without custom validator bean:

    2024-10-27 16:12:39,149 [http-nio-8080-exec-2] DEBUG o.s.w.f.CommonsRequestLoggingFilter - Before request [POST /email/v1]
    2024-10-27 16:12:39,180 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'emailController'
    2024-10-27 16:12:39,403 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.AssertTrueValidator'
    2024-10-27 16:12:39,404 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.AssertTrueValidator'
    2024-10-27 16:12:39,410 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.NotBlankValidator'
    2024-10-27 16:12:39,410 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.NotBlankValidator'
    2024-10-27 16:12:39,411 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.EmailValidator'
    2024-10-27 16:12:39,414 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Finished creating instance of bean 'org.hibernate.validator.internal.constraintvalidators.bv.EmailValidator'
    2024-10-27 16:12:39,655 [Aspirin-DeliveryManager-18] INFO  Aspirin  - DeliveryManager started.
    2024-10-27 16:12:39,746 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'startupTimeMetrics'
    2024-10-27 16:12:39,747 [http-nio-8080-exec-2] DEBUG o.s.w.f.CommonsRequestLoggingFilter - After request [POST /email/v1]
    

    First request logs with custom validator bean:

    2024-10-27 16:29:46,429 [http-nio-8080-exec-2] DEBUG o.s.w.f.CommonsRequestLoggingFilter - Before request [POST /email/v1]
    2024-10-27 16:29:46,455 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'emailController'
    2024-10-27 16:29:46,910 [Aspirin-DeliveryManager-18] INFO  Aspirin  - DeliveryManager started.
    2024-10-27 16:29:46,975 [http-nio-8080-exec-2] TRACE o.s.b.f.s.DefaultListableBeanFactory - Returning cached instance of singleton bean 'startupTimeMetrics'
    2024-10-27 16:29:46,975 [http-nio-8080-exec-2] DEBUG o.s.w.f.CommonsRequestLoggingFilter - After request [POST /email/v1]