1. 程式人生 > 實用技巧 >hibernate validation,spring validation自定義引數校驗

hibernate validation,spring validation自定義引數校驗

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();
    }
}

第三步:使用

完美