hibernate validation,spring validation自定義引數校驗
阿新 • • 發佈:2020-12-24
1.背景
在實際開發中,我們除了會使用常用的引數判斷,如字串不為空,最大值,最小值等
我們還可以自定義引數校驗規則
2.實際生產問題
實際生產中同步訂單的時候,
假設我們要求訂單狀態值只能是 -1, 0, 1, 或者不傳
3.實現方案
步驟一:建立一個引數檢查物件EnumValueValidator
注意:這裡要用到下一步建立的註解EnumValue
package com.ldp.notify.common.validation; import cn.hutool.core.util.StrUtil; import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext; /** * @Copyright (C) * @Author: lidongping * @Date: 2020-12-24 17:57 * @Description: * <P> * 建立一個引數檢查物件 * </P> */ public class EnumValueValidator implements ConstraintValidator<EnumValue, Object> { private String[] strValues;private int[] intValues; @Override public void initialize(EnumValue constraintAnnotation) { strValues = constraintAnnotation.strValues(); intValues = constraintAnnotation.intValues(); } @Override public boolean isValid(Object value, ConstraintValidatorContext context) {if (value==null || StrUtil.isEmpty(value.toString())){ return true; } if (value instanceof String) { for (String s : strValues) { if (s.equals(value)) { return true; } } } else if (value instanceof Integer) { for (Integer s : intValues) { if (s == value) { return true; } } } return false; } }
步驟二:建立一個註解EnumValue
注意這裡要用到上一步建立的檢查物件EnumValueValidator
package com.ldp.notify.common.validation; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * @Copyright (C) * @Author: lidongping * @Date: 2020-12-24 17:53 * @Description: */ @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {EnumValueValidator.class}) public @interface EnumValue { //預設錯誤訊息 String message() default "必須為指定值:0,1"; String[] strValues() default {"0", "1"}; int[] intValues() default {}; //分組 Class<?>[] groups() default {}; //負載 Class<? extends Payload>[] payload() default {}; //指定多個時使用 @Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE}) @Retention(RUNTIME) @Documented @interface List { EnumValue[] value(); } }
第三步:使用