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(); } }
第三步:使用
@Pattern(regexp = "^((-1)|(0)|(1)|())$", message = "status 取值范围为:-1,0,1,或不传")