javascript
bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数
1. 概述
在項目實際開發過程中,為了更好的復用,我們參考Spring Boot Starters,封裝了許多企業內部中間件的starter。這些中間件的接入都需要申請并在項目中配置一些特定的參數。我們通過@ConfigurationProperties注解,增加了在配置過程的體驗,實現屬性提示。一些參數是在中間件使用過程中的必選參數,經常發現項目啟動了,調用中間件時拋出異常,提示某個參數沒有配置。
這樣的接入過程體驗很不好。
有沒有一種方式在項目啟動的時候就對配置的參數直接進行校驗,而不是等到實際使用的時候再拋出錯誤提示呢?
很幸運,Spring已經為我們提供的Java Validation可以解決我們的問題。
2. 增加啟動校驗
在我們創建的Properties類中增加Validation相關配置:
/**?*?ConfigProperties.?*?*?@author?Wang?Jianchao(tinyking)?*??*?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?configuration3. 自定義校驗
Spring還支持我們進行自定義校驗規則,通過自定義校驗可以實現復雜的校驗邏輯。
我們創建一個校驗類,并實現Validator接口:
/**?*?ConfigPropertiesValidator.?*?*?@author?Wang?Jianchao(tinyking)?*??*?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()?
需要注意的是,上面的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.yml中config.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?shotAction:Update?your?application's?configuration錯誤信息即為我們自定義校驗的結果。
4. 結論
通過配置Spring Boot啟動校驗功能,可以快速的識別參數配置的錯誤,使我們在開發過程中有更好starter集成體驗。
總結
以上是生活随笔為你收集整理的bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: C# 根据模板 导出 Excel 图
 - 下一篇: 1025. 反转链表 (25)