【问题标题】:How are @Configuration classes validated automatically on Start Up of Spring Boot application?如何在 Spring Boot 应用程序启动时自动验证 @Configuration 类?
【发布时间】:2021-05-22 02:33:42
【问题描述】:

我有一个名为 MyConfig.java 的类。

    import javax.validation.constraints.NotNull;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Configuration;

    @Configuration
    public class MyConfig {
       @NotNull
       @Value("${test.key}")
        public String queryIndex;
     }

我的问题是,它如何在没有任何@Validated 或@Valid 的情况下在 Spring Boot 应用程序的启动中得到验证。我了解 @Configuration 类在启动时由 Spring 容器拾取(以生成 bean 定义,如果有的话)并且 javax.validator 在类路径上。

下面的代码 sn-p 是有意义的,因为在 POJO 类上添加了 @Valid 注解:

    @PostMapping
    public String test(@Valid @RequestBody Employee emp) {
        
        return "";
    }

来自 Spring Doc:-

Link Here for reference

3.8.1。 JSR-303 Bean 验证 API 概述

JSR-303 标准化了 Java 平台的验证约束声明和元数据。使用此 API,您可以使用声明性验证约束来注释域模型属性,并且运行时会强制执行它们。

【问题讨论】:

  • 你可以写切面或者BeanPostProcessor和检查逻辑

标签: java spring spring-boot


【解决方案1】:

这是解决方案:-

MyConfig.java

import javax.validation.constraints.NotBlank;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@Configuration
@Validated
@ConfigurationProperties(prefix="test")
public class MyConfig {
    
    private Logger logger = LoggerFactory.getLogger(MyConfig.class);
    private static final String MYNAME = MyConfig.class.getSimpleName();
    
    @NotBlank(message = "Key should not be empty")
    @Value("${test.key}")
    public String test;

    public String getTest() {
        return test;
    }

    public void setTest(String test) {
        this.test = test;
    }
   }

application.properties

server.port=5555
test.key=
test.name=

这个依赖在pom.xml

中是必须的
 <dependency>
     <groupId>javax.validation</groupId>
     <artifactId>validation-api</artifactId>
     <version>2.0.1.Final</version>
  </dependency>

因此,@Validated、@ConfigurationProperties 结合 javax.validation 约束在幕后工作。

错误说明:-

绑定到目标 org.springframework.boot.context.properties.bind.BindException: 无法将“test”下的属性绑定到 com.cgi.demo.MyConfig$$EnhancerBySpringCGLIB$$3dcd81ec 失败:

Property: test.test
Value: 
Reason: Key should not be empty

供您参考 SprinBoot 文档:-

Click Here for more info

2.7.9。 @ConfigurationProperties 验证

只要 @ConfigurationProperties 类被 Spring 的 @Validated 注释注释,Spring Boot 就会尝试验证它们。您可以直接在配置类上使用 JSR-303 javax.validation 约束注释。为此,请确保您的类路径中有一个兼容的 JSR-303 实现,然后将约束注释添加到您的字段中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多