Springboot中的Validation參數(shù)校驗(yàn)詳解
Springboot 參數(shù)校驗(yàn)
Springboot項(xiàng)目中,引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
基本的使用網(wǎng)上有很多教程,就不介紹了。
關(guān)于使用
- 校驗(yàn)@RequestParam、@PathVariable等,只需在controller類上加@Validated注解
- 校驗(yàn)JavaBean,在controlle上注解@Validated且在參數(shù)前加@Validated
下面以該類為例
@Data public class TestParam { /** * insert時(shí)要求為null */ @Null(groups = Insert.class) /** * update時(shí)要求不為空 */ @NotEmpty(groups = Update.class) private List<@NotNull Long> ids; @EnumValue(value = Gender.class) private String gender; @Valid private List<@NotNull Pet> pets; /** * 默認(rèn)分組為default,若不繼承 * Validated指定分組后,非指定分組將失效 */ public interface Insert extends Default { } public interface Update extends Default { } } @Data public class Pet { @Size(min = 1, max = 5) private String name; }
分組校驗(yàn)
分組校驗(yàn)有點(diǎn)類似Jackson序列化的JsonView,不同的情況下采取不同的策略,例如,注冊時(shí)賬戶名必須在數(shù)據(jù)庫中唯一,而登錄時(shí)賬戶必須在數(shù)據(jù)庫中存在,這個(gè)時(shí)候就需要為校驗(yàn)設(shè)置分組了。 情況一
@PostMapping("/insert") public TestParam insert(@RequestBody @Validated(TestParam.Insert.class) TestParam param) { return param; }
情況二
@PostMapping("/update") public TestParam update(@RequestBody @Validated(TestParam.Update.class) TestParam param) { return param; }
自定義校驗(yàn)
如下為自定義枚舉值校驗(yàn),用于解決屬性定義不是enum類型,但想約束其值為枚舉類型,例如上面的gender,假如定義為Gender,那么默認(rèn)只能MALE或者FEMALE,想要男、女也通過校驗(yàn),可以使用該注解
@Target({FIELD, PARAMETER}) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {EnumValidator.class}) public @interface EnumValue { String message() default "錯(cuò)誤的枚舉值"; EnumValidateBy by() default EnumValidateBy.TOSTRING; Class<? extends Enum<?>> targetEnum(); Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } public enum EnumValidateBy { /** * 使用枚舉類的哪個(gè)值校驗(yàn) * 如MAEL("男"), FEMALE("女") * NAME 值必須為MAEL或者FEMALE * TOSTRING 重寫toString方法返回男或者女, 值必須為男或者女 * BOTH 以上值均可 */ BOTH, NAME, TOSTRING }
實(shí)現(xiàn)ConstraintValidator接口校驗(yàn)
public class EnumValidator implements ConstraintValidator<EnumValue, String> { private final Set<String> set = new HashSet<>(8); @Override public void initialize(EnumValue constraintAnnotation) { Class<? extends Enum<?>> enumCls = constraintAnnotation.targetEnum(); EnumValidateBy by = constraintAnnotation.by(); Enum<?>[] constants = enumCls.getEnumConstants(); if (by == EnumValidateBy.NAME) { set.addAll(Arrays.stream(constants).map(Enum::name).collect(Collectors.toSet())); } else if (by == EnumValidateBy.TOSTRING) { set.addAll(Arrays.stream(constants).map(Enum::toString).collect(Collectors.toSet())); } else { set.addAll(Arrays.stream(constants).map(Enum::name).collect(Collectors.toSet())); set.addAll(Arrays.stream(constants).map(Enum::toString).collect(Collectors.toSet())); } } @Override public boolean isValid(String value, ConstraintValidatorContext context) { return set.contains(value); } }
null不在set中,校驗(yàn)不通過
集合元素校驗(yàn)
基本類型
直接在泛型參數(shù)上加上需要的注解即可
JavaBean類型
- 如僅對整個(gè)JavaBean進(jìn)行校驗(yàn),例如@NotNull注解,直接將注解寫在泛型參數(shù)即可
- 如需對集合中每個(gè)JavaBean的屬性進(jìn)行校驗(yàn),還需加上@Valid注解,如上面的pets
快速失敗模式
hibernate官網(wǎng)的配置如下:
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class ) .configure() .addProperty( "hibernate.validator.fail_fast", "true" ) .buildValidatorFactory(); Validator validator = validatorFactory.getValidator();
只要往容器中注入Validator對象就行了。 因?yàn)閟pring自動(dòng)配置好了,但沒有開啟快速失敗模式,最后,參照Springboot自動(dòng)配置的ValidationAutoConfiguration,只添加了快速失敗部分,其余未做改動(dòng)。
@Configuration public class ValidationConfig { @Bean public Validator validatorFactory(ApplicationContext context) { LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean() { @Override protected void postProcessConfiguration(javax.validation.Configuration<?> configuration) { configuration.addProperty("hibernate.validator.fail_fast", "true"); } }; MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory(context); factoryBean.setMessageInterpolator(interpolatorFactory.getObject()); return factoryBean; } }
總結(jié)
Springboot 參數(shù)校驗(yàn)是一種有效的驗(yàn)證機(jī)制,可以避免常見的錯(cuò)誤,并提高程序的健壯性和穩(wěn)定性。它的實(shí)現(xiàn)方式基于Java Bean驗(yàn)證框架,通過添加注解的方式,對屬性值進(jìn)行校驗(yàn)。開發(fā)者只需要在程序中加入相關(guān)注解即可完成參數(shù)的校驗(yàn),從而提高了程序的開發(fā)效率和穩(wěn)定性。
- 在controller層使用
- 分組時(shí)記得繼承Default接口
- 集合嵌套校驗(yàn)
- 快速失敗模式
到此這篇關(guān)于Springboot中的Validation參數(shù)校驗(yàn)詳解的文章就介紹到這了,更多相關(guān)Validation參數(shù)校驗(yàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot中配置文件application.properties使用
這篇文章主要介紹了Spring Boot中配置文件application.properties使用及spring boot讀取application.properties文件的方式,需要的朋友參考下吧2018-01-01Java Set集合及其子類HashSet與LinkedHashSet詳解
這篇文章主要介紹了Java Set集合及其子類HashSet與LinkedHashSet詳解,文章通過Set集合存儲原理展開文章主題相關(guān)介紹,感興趣的小伙伴可以參考一下2022-06-06Java編程實(shí)現(xiàn)比對兩個(gè)文本文件并標(biāo)記相同與不同之處的方法
這篇文章主要介紹了Java編程實(shí)現(xiàn)比對兩個(gè)文本文件并標(biāo)記相同與不同之處的方法,涉及java針對文本文件的讀取、遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10SpringBoot 整合 dubbo xml實(shí)現(xiàn)代碼示例
這篇文章主要介紹了SpringBoot 整合 dubbo xml實(shí)現(xiàn)代碼示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03Mybatis動(dòng)態(tài)拼接sql提高插入速度實(shí)例
這篇文章主要介紹了Mybatis動(dòng)態(tài)拼接sql提高插入速度實(shí)例,當(dāng)數(shù)據(jù)量少的時(shí)候,沒問題,有效時(shí)間內(nèi)可能完成插入,但是當(dāng)數(shù)據(jù)量達(dá)到一定程度的時(shí)候,每次都一個(gè)sql插入超時(shí),所以采用了拼接sql的方式加快速度,需要的朋友可以參考下2023-09-09阿里dubbo出錯(cuò)提示Thread pool is EXHAUSTED問題及解決方法
這篇文章主要介紹了阿里dubbo出錯(cuò)提示Thread pool is EXHAUSTED的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08