当Spring Boot应用程序启动时,JSR-303注释不会验证bean属性

问题描述 投票:3回答:2

我需要在启动时验证属性bean,并且如果验证失败,应用程序将无法启动。

我有一个包含环境变量提供的配置的bean:

@Component
public class AdminConfig
{
    @NotNull( message = "username can't be null")
    @NotEmpty( message = "username can't be empty")
    @Value(value="#{environment.username}")
    /** username to the admin portal **/
    private String username;

    @NotNull(message = "password can't be null")
    @NotEmpty(message = "password can't be empty")
    @Value(value="#{environment.password}")
    /** password to the admin portal **/
    private String password;
}

我有一个驱动程序类:

/**
 * Driver class.
 */
@EnableAutoConfiguration
public class Main {

    /**
     * Driver method.
     * @param args Command line arguments.
     */
    public static void main(final String[] args)  {
        SpringApplication.run(Main.class, args);

    }
 }

我有以下POM条目:

<dependencies>
        <!-- Spring -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
        <!-- Validation annotations -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>
</dependencies>

当我在没有设置环境变量的情况下启动应用程序时,会创建AdminConfig bean,但不会触发验证并启动应用程序。

我希望/要求应用程序因验证失败而无法启动。

spring-boot bean-validation hibernate-validator
2个回答
2
投票

只有在请求时才会进行bean验证。 bean实例化不会请求验证。

The 3.8.2. Configuring a Bean Validation Provider section of the Spring documentation暗示需要Validator来验证一个实例:

Spring提供对Bean Validation API的完全支持。这包括方便地支持将JSR-303 / JSR-349 Bean Validation提供程序作为Spring bean引导。这允许在应用程序中需要验证的任何地方注入javax.validation.ValidatorFactory或javax.validation.Validator。

请注意,在某些特定情况下,请求验证而不需要明确地/以编程方式执行验证。例如,当您在Spring JPA存储库中持久化实体时,或者在调用接受带有@Valid注释的参数的Spring MVC / Rest bean方法时,就是这种情况。

在您的情况下,您可以通过注入和使用Validator bean(在Spring Boot中使用您在pom.xml中声明的启动器)来注入其依赖项之后验证bean:

import java.util.Set;

import javax.annotation.PostConstruct;
import javax.validation.ConstraintViolation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AdminConfig{

    @Autowired
    private Validator validator;

    @NotNull( message = "username can't be null")
    @NotEmpty( message = "username can't be empty")
    private String username;

    @NotNull(message = "password can't be null")
    @NotEmpty(message = "password can't be empty")
    private String password;

    @PostConstruct
    public void init() {
        final Set<ConstraintViolation<AdminConfig>> validationErrors = validator.validate(this);
        if (!validationErrors.isEmpty()) {
            throw new ValidationException("validation errors for adminConfig bean : " + validationErrors);
        }
    }
}

5
投票

在AdminConfig上使用@Validated注释

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