zoukankan      html  css  js  c++  java
  • 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,或不传")

    完美

  • 相关阅读:
    [python]windows截图
    [python]PyPI使用国内源
    [MySQL]配置多个MySQL服务(Windows)
    [C#]中获取当前程序运行路径的方法
    [C#]统计文本文件txt中的行数(快速读取)
    [C#]获取连接MySql数据库及常用的CRUD操作
    html和css高级
    html和css进阶
    html和css入门
    Git 简介
  • 原文地址:https://www.cnblogs.com/newAndHui/p/14185807.html
Copyright © 2011-2022 走看看