SpringBoot開發(fā)技巧啟動(dòng)時(shí)配置校驗(yàn)實(shí)現(xiàn)示例
概述
在項(xiàng)目開發(fā)過程中,某個(gè)功能需要依賴在配置文件中配置的參數(shù)。這時(shí)候就可能出現(xiàn)下面這種現(xiàn)象問題:
有時(shí)候經(jīng)常出現(xiàn)項(xiàng)目啟動(dòng)了,等到使用某個(gè)功能組件的時(shí)候出現(xiàn)異常,提示參數(shù)未配置或者bean注入失敗。
有沒有一種方法在項(xiàng)目啟動(dòng)時(shí)就對(duì)參數(shù)進(jìn)行校驗(yàn)而不是在實(shí)際使用的時(shí)候再拋出提示呢?
答案就是使用Spring提供的Java Validation功能,簡單實(shí)用。
增加啟動(dòng)校驗(yàn)
只需要在我們創(chuàng)建的配置Properties類增加Validation相關(guān)配置即可
@Validated
@Data
@ConfigurationProperties(prefix = "app")
@Component
public class AppConfigProperties {
@NotEmpty(message = "配置文件配置必須要配置[app.id]屬性")
private String id;
}
上面的配置就會(huì)校驗(yàn)我們?cè)?application.yml中有沒有配置 app.id參數(shù)。如果在配置文件中沒有該配置,項(xiàng)目啟動(dòng)就會(huì)失敗,并拋出校驗(yàn)異常。
在使用配置文件校驗(yàn)時(shí),必須使用@configurationproperties注解,@value不支持該注解。
在需要使用app.id的時(shí)候注入配置類即可:
@Autowired private AppConfigProperties appConfigProperties;
這樣就可以實(shí)現(xiàn)我們想要的效果,如下圖:
效果
校驗(yàn)類型
| 校驗(yàn)規(guī)則 | 規(guī)則說明 |
|---|---|
| @Null | 限制只能為null |
| @NotNull | 限制必須不為null |
| @AssertFalse | 限制必須為false |
| @AssertTrue | 限制必須為true |
| @DecimalMax(value) | 限制必須為一個(gè)不大于指定值的數(shù)字 |
| @DecimalMin(value) | 限制必須為一個(gè)不小于指定值的數(shù)字 |
| @Digits(integer,fraction) | 限制必須為一個(gè)小數(shù),且整數(shù)部分的位數(shù)不能超過integer,小數(shù)部分的位數(shù)不能超過fraction |
| @Future | 限制必須是一個(gè)將來的日期 |
| @Max(value) | 限制必須為一個(gè)不大于指定值的數(shù)字 |
| @Min(value) | 限制必須為一個(gè)不小于指定值的數(shù)字 |
| @Past | 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早 |
| @Pattern(value) | 限制必須符合指定的正則表達(dá)式 |
| @Size(max,min) | 限制字符長度必須在min到max之間 |
| @NotEmpty | 驗(yàn)證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0) |
| @NotBlank | 驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的空格 |
| 驗(yàn)證注解的元素值是Email,也可以通過正則表達(dá)式和flag指定自定義的email格式 |
Validation 支持如下幾種校驗(yàn),可以滿足基本的業(yè)務(wù)邏輯,當(dāng)然如果還是滿足不了你的業(yè)務(wù)邏輯,可以選擇定制校驗(yàn)規(guī)則。
定制校驗(yàn)邏輯
定義校驗(yàn)邏輯規(guī)則,實(shí)現(xiàn) org.springframework.validation.Validator
public class ConfigPropertiesValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return AppConfigProperties.class.isAssignableFrom(aClass);
}
@Override
public void validate(Object o, Errors errors) {
AppConfigProperties config = (AppConfigProperties) o;
if(StringUtils.isEmpty(config.getId())){
errors.rejectValue("id", "app.id.empty", "[app.id] 屬性必須要在配置文件配置");
}else if (config.getId().length() < 5) {
errors.rejectValue("id", "app.id.short", "[app.id] 屬性的長度必須不能小于5");
}
}
}
使用自定義校驗(yàn)規(guī)則就不需要在使用原生的@NotEmpty了,將其刪除
@Validated
@Data
@ConfigurationProperties(prefix = "app")
@Component
public class AppConfigProperties {
// @NotEmpty(message = "配置文件配置必須要配置[app.id]屬性")
private String id;
}
注入自定義校驗(yàn)規(guī)則
@Bean
public ConfigPropertiesValidator configurationPropertiesValidator(){
return new ConfigPropertiesValidator();
}
注意:這里bean的方法名必須要 configurationPropertiesValidator,否則啟動(dòng)的時(shí)候不會(huì)執(zhí)行該校驗(yàn)
修改app.id配置,觀察啟動(dòng)情況

測試驗(yàn)證結(jié)果
錯(cuò)誤信息即為我們自定義校驗(yàn)的結(jié)果。
小結(jié)
通過配置Spring Boot啟動(dòng)校驗(yàn)功能,可以快速的識(shí)別參數(shù)配置的錯(cuò)誤,避免在使用組件的時(shí)候才發(fā)現(xiàn)問題,可以減少排查問題的工作量,并且在我們封裝自定義的starter時(shí)可以有更好的體驗(yàn)。
以上就是SpringBoot開發(fā)技巧啟動(dòng)時(shí)配置校驗(yàn)實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot啟動(dòng)時(shí)配置校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot--Banner的定制和關(guān)閉操作
這篇文章主要介紹了SpringBoot--Banner的定制和關(guān)閉操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2018-05-05
解決springboot3:mybatis-plus依賴錯(cuò)誤:org.springframework.beans.fac
這篇文章主要介紹了解決springboot3:mybatis-plus依賴錯(cuò)誤:org.springframework.beans.factory.UnsatisfiedDependencyException問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Java用POI導(dǎo)入導(dǎo)出Excel實(shí)例分析
在本篇文章里小編給大家整理的是一篇關(guān)于Java用POI導(dǎo)入導(dǎo)出Excel實(shí)例分析內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)下。2021-11-11
Spring boot應(yīng)用啟動(dòng)后首次訪問很慢的解決方案
這篇文章主要介紹了Spring boot應(yīng)用啟動(dòng)后首次訪問很慢的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

