【问题标题】:JSR-303 annotations do not validate bean properties when Spring Boot application starts当 Spring Boot 应用程序启动时,JSR-303 注释不验证 bean 属性
【发布时间】:2018-08-12 11:16:42
【问题描述】:

我需要在启动时验证属性 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


    【解决方案1】:

    在 AdminConfig 中使用 @Validated 注解

    【讨论】:

    • 像魅力一样工作!干杯!
    • 谢谢,正是我想要的。
    【解决方案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 的便捷支持 作为 Spring bean 的验证提供程序。 这允许一个 javax.validation.ValidatorFactory 或 javax.validation.Validator 是 在您的应用程序中需要验证的地方注入

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

    在您的情况下,您可以通过注入和使用Validator bean(在您在 pom.xml 中声明的启动器与 Spring Boot 一起使用)注入依赖项后验证 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);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 1970-01-01
      • 2011-09-12
      • 2011-07-24
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多