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;
/**
* 默認(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;
}分組校驗
分組校驗有點類似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,那么默認(rèn)只能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進(jìn)行校驗,例如@NotNull注解,直接將注解寫在泛型參數(shù)即可
- 如需對集合中每個JavaBean的屬性進(jì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對象就行了。 因為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ù)校驗是一種有效的驗證機(jī)制,可以避免常見的錯誤,并提高程序的健壯性和穩(wěn)定性。它的實現(xiàn)方式基于Java Bean驗證框架,通過添加注解的方式,對屬性值進(jìn)行校驗。開發(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)文章
Java堆空間爆滿導(dǎo)致宕機(jī)的問題分析及解決
團(tuán)隊有一個服務(wù),一直運(yùn)行的好好的,突然訪問異常了,先是請求超時,然后直接無法訪問,本文將給大家介紹Java堆空間爆滿導(dǎo)致宕機(jī)的問題分析及解決,需要的朋友可以參考下2024-02-02
mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解
這篇文章主要介紹了mybatis寫xml時數(shù)字類型千萬別用 !=‘‘(不為空串)進(jìn)行判斷的示例詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Java實現(xiàn)學(xué)生管理系統(tǒng)詳解流程
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題剖析
使用了SpringBoot的項目,在遠(yuǎn)程連接Redis服務(wù)器時,會遇倒一些小問題,下面通過本文給大家全面解析SpringBoot遠(yuǎn)程訪問redis服務(wù)器問題,需要的朋友參考下吧2017-04-04

