温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

项目启动时怎样校验Spring Boot配置参数

发布时间:2021-12-02 16:27:50 来源:亿速云 阅读:232 作者:柒染 栏目:大数据

本篇文章给大家分享的是有关项目启动时怎样校验Spring Boot配置参数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

 

1. 概述

在项目实际开发过程中,为了更好的复用,我们参考Spring Boot Starters,封装了许多企业内部中间件的starter。这些中间件的接入都需要申请并在项目中配置一些特定的参数。我们通过@ConfigurationProperties注解,增加了在配置过程的体验,实现属性提示。一些参数是在中间件使用过程中的必选参数,经常发现项目启动了,调用中间件时抛出异常,提示某个参数没有配置。

这样的接入过程体验很不好。

有没有一种方式在项目启动的时候就对配置的参数直接进行校验,而不是等到实际使用的时候再抛出错误提示呢?

很幸运,Spring已经为我们提供的Java Validation可以解决我们的问题。

 

2. 增加启动校验

在我们创建的Properties类中增加Validation相关配置:

/**
* ConfigProperties.
*
* @author Wang Jianchao(tinyking)
* <p>
* Created on 2020/8/20
*/
@Validated
@Data
@ConfigurationProperties(prefix = "config")
public class ConfigProperties {
   @NotEmpty
   private String name;
}
 

@Validated是Spring提供的校验注解,通过该注解告诉Spring这个类是需要进行校验处理的。

@NotEmpty 是Java Validation API中提供的校验注解,表示name字段不能为空。不能为空是指不能是null,也不能是空字符串。

配置Bean

@Configuration
@EnableConfigurationProperties(ConfigProperties.class)
public class ValidationConfiguration {

   @Bean
   public ConfigProperties configProperties() {
       return new ConfigProperties();
   }
}

 

上面的配置就会校验我们在application.yml中有没有配置config.name参数。如果在配置文件中没有该配置,项目启动就会失败,并抛出校验异常:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:

   Property: config.name
   Value: null
   Reason: 不能为空

 

application.yml中,我们增加config.name等配置项,但是不给它设置内容:

config:
name:
 

再次启动项目,发现错误信息发生了变化:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:

   Property: config.name
   Value:
   Origin: class path resource [application.yml]:2:8
   Reason: 不能为空


Action:

Update your application's configuration
   

3. 自定义校验

Spring还支持我们进行自定义校验规则,通过自定义校验可以实现复杂的校验逻辑。

我们创建一个校验类,并实现Validator接口:

/**
* ConfigPropertiesValidator.
*
* @author Wang Jianchao(tinyking)
* <p>
* Created on 2020/8/20
*/
public class ConfigPropertiesValidator implements Validator {
   @Override
   public boolean supports(Class<?> aClass) {
       return ConfigProperties.class.isAssignableFrom(aClass);
   }

   @Override
   public void validate(Object target, Errors errors) {
       ConfigProperties config = (ConfigProperties) target;

       if (!StringUtils.isEmpty(config.getName()) && config.getName().length() < 5) {
           errors.rejectValue("name", "name.too.shot", "name is too shot");
       }
   }
}

 

需要注意的是,上面的Validator接口是Spring框架提供的,不是Java Validation API中的接口。

  • supports(Class<?> aClass)方法用来判断是否支持当前正在进行校验的实例
  • validate(Object target, Errors errors)方法中写实际的校验规则,并用     errors收集错误信息

接下来就是如何在Spring Boot启动时,对Properties进行校验了。这一步非常关键!

    @Bean
   public static ConfigPropertiesValidator configurationPropertiesValidator() {
       return new ConfigPropertiesValidator();
   }
 

其中有两个注意点:

  • 方法名必须为     configurationPropertiesValidator ,否则在启动的时候不会执行该校验
  • 方法必须声明为     static, 告诉Spring,该Bean的创建要在所有的Configuration之前

我们修改在application.ymlconfig.name

config:
name: a
 

这样,name长度就不能满足我们自定义的校验规则,启动程序,查看结果:

***************************
APPLICATION FAILED TO START
***************************

Description:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'config' to io.github.tinyking.springvalidation.config.ConfigProperties failed:

   Property: config.name
   Value: a
   Origin: class path resource [application.yml]:2:9
   Reason: name is too shot


Action:

Update your application's configuration

错误信息即为我们自定义校验的结果。

通过配置Spring Boot启动校验功能,可以快速的识别参数配置的错误,使我们在开发过程中有更好starter集成体验。

以上就是项目启动时怎样校验Spring Boot配置参数,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI