Springboot中的Validation參數(shù)校驗詳解
Springboot 參數(shù)校驗
Springboot項目中,引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
基本的使用網(wǎng)上有很多教程,就不介紹了。
關(guān)于使用
- 校驗@RequestParam、@PathVariable等,只需在controller類上加@Validated注解
- 校驗JavaBean,在controlle上注解@Validated且在參數(shù)前加@Validated
下面以該類為例
@Data
public class TestParam {
/**
* insert時要求為null
*/
@Null(groups = Insert.class)
/**
* update時要求不為空
*/
@NotEmpty(groups = Update.class)
private List<@NotNull Long> ids;
@EnumValue(value = Gender.class)
private String gender;
@Valid
private List<@NotNull Pet> pets;
/**
* 默認分組為default,若不繼承
* Validated指定分組后,非指定分組將失效
*/
public interface Insert extends Default {
}
public interface Update extends Default {
}
}
@Data
public class Pet {
@Size(min = 1, max = 5)
private String name;
}分組校驗
分組校驗有點類似Jackson序列化的JsonView,不同的情況下采取不同的策略,例如,注冊時賬戶名必須在數(shù)據(jù)庫中唯一,而登錄時賬戶必須在數(shù)據(jù)庫中存在,這個時候就需要為校驗設(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;
}
自定義校驗
如下為自定義枚舉值校驗,用于解決屬性定義不是enum類型,但想約束其值為枚舉類型,例如上面的gender,假如定義為Gender,那么默認只能MALE或者FEMALE,想要男、女也通過校驗,可以使用該注解
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {EnumValidator.class})
public @interface EnumValue {
String message() default "錯誤的枚舉值";
EnumValidateBy by() default EnumValidateBy.TOSTRING;
Class<? extends Enum<?>> targetEnum();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public enum EnumValidateBy {
/**
* 使用枚舉類的哪個值校驗
* 如MAEL("男"), FEMALE("女")
* NAME 值必須為MAEL或者FEMALE
* TOSTRING 重寫toString方法返回男或者女, 值必須為男或者女
* BOTH 以上值均可
*/
BOTH, NAME, TOSTRING
}實現(xiàn)ConstraintValidator接口校驗
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中,校驗不通過
集合元素校驗
基本類型
直接在泛型參數(shù)上加上需要的注解即可

JavaBean類型
- 如僅對整個JavaBean進行校驗,例如@NotNull注解,直接將注解寫在泛型參數(shù)即可
- 如需對集合中每個JavaBean的屬性進行校驗,還需加上@Valid注解,如上面的pets

快速失敗模式
hibernate官網(wǎng)的配置如下:
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure()
.addProperty( "hibernate.validator.fail_fast", "true" )
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();只要往容器中注入Validator對象就行了。 因為spring自動配置好了,但沒有開啟快速失敗模式,最后,參照Springboot自動配置的ValidationAutoConfiguration,只添加了快速失敗部分,其余未做改動。
@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ù)校驗是一種有效的驗證機制,可以避免常見的錯誤,并提高程序的健壯性和穩(wěn)定性。它的實現(xiàn)方式基于Java Bean驗證框架,通過添加注解的方式,對屬性值進行校驗。開發(fā)者只需要在程序中加入相關(guān)注解即可完成參數(shù)的校驗,從而提高了程序的開發(fā)效率和穩(wěn)定性。
- 在controller層使用
- 分組時記得繼承Default接口
- 集合嵌套校驗
- 快速失敗模式
到此這篇關(guān)于Springboot中的Validation參數(shù)校驗詳解的文章就介紹到這了,更多相關(guān)Validation參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot中配置文件application.properties使用
這篇文章主要介紹了Spring Boot中配置文件application.properties使用及spring boot讀取application.properties文件的方式,需要的朋友參考下吧2018-01-01
Java Set集合及其子類HashSet與LinkedHashSet詳解
這篇文章主要介紹了Java Set集合及其子類HashSet與LinkedHashSet詳解,文章通過Set集合存儲原理展開文章主題相關(guān)介紹,感興趣的小伙伴可以參考一下2022-06-06
Java編程實現(xiàn)比對兩個文本文件并標記相同與不同之處的方法
這篇文章主要介紹了Java編程實現(xiàn)比對兩個文本文件并標記相同與不同之處的方法,涉及java針對文本文件的讀取、遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10
SpringBoot 整合 dubbo xml實現(xiàn)代碼示例
這篇文章主要介紹了SpringBoot 整合 dubbo xml實現(xiàn)代碼示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
阿里dubbo出錯提示Thread pool is EXHAUSTED問題及解決方法
這篇文章主要介紹了阿里dubbo出錯提示Thread pool is EXHAUSTED的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08

