項目啓動時首先校驗Spring Boot配置參數

1. 概述

在項目實際開發過程當中,爲了更好的複用,咱們參考Spring Boot Starters,封裝了許多企業內部中間件的starter。這些中間件的接入都須要申請並在項目中配置一些特定的參數。咱們經過@ConfigurationProperties註解,增長了在配置過程的體驗,實現屬性提示。一些參數是在中間件使用過程當中的必選參數,常常發現項目啓動了,調用中間件時拋出異常,提示某個參數沒有配置。git

這樣的接入過程體驗很很差。github

有沒有一種方式在項目啓動的時候就對配置的參數直接進行校驗,而不是等到實際使用的時候再拋出錯誤提示呢?web

很幸運,Spring已經爲咱們提供的Java Validation能夠解決咱們的問題。spring

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這個類是須要進行校驗處理的。app

@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參數。若是在配置文件中沒有該配置,項目啓動就會失敗,並拋出校驗異常:ide

***************************
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等配置項,可是不給它設置內容:spa

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

錯誤信息即爲咱們自定義校驗的結果。

4. 結論

經過配置Spring Boot啓動校驗功能,能夠快速的識別參數配置的錯誤,使咱們在開發過程當中有更好starter集成體驗。


本文分享自微信公衆號 - Java碼農(jarcoder)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索