首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当Spring应用程序启动时,JSR-303注释不验证bean属性。

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

Stack Overflow用户
提问于 2018-03-04 19:43:20
回答 2查看 2.3K关注 0票数 4

我需要在启动时验证一个属性bean,如果验证失败,应用程序就会失败。

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

代码语言:javascript
复制
@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;
}

我有个驾驶课:

代码语言:javascript
复制
/**
 * 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条目:

代码语言:javascript
复制
<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将被创建为,但是验证不会触发,并且应用程序将启动。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-04 20:32:32

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

3.8.2号。配置Spring文档的Bean验证提供程序部分意味着必须使用验证器才能使实例有效:

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

请注意,在某些特定情况下,不需要明确/以编程方式进行验证,就会请求验证。例如,您在Spring中持久化一个实体,或者调用Spring /Rest方法,该方法接受带有@Valid注释的参数。

在您的示例中,您可以通过注入和使用Spring (与您在Validator中声明的启动器一起使用Spring)来验证它的依赖关系:

代码语言:javascript
复制
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);
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-06-27 12:40:00

在AdminConfig上使用@Validated注释

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49099646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档