zoukankan      html  css  js  c++  java
  • validation

    validation

    说明

    后台开发需要对对象的传进来的参数进行校验,有专门的校验工具,validation bean 是基于JSR-303标准开发出来的,使用注解方式实现,及其方便,但是这只是一个接口,没有具体实现。

    依赖

     <dependency>
         <groupId>javax.validation</groupId>
         <artifactId>validation-api</artifactId>
         <version>2.0.1.Final</version>
     </dependency>

    注解类型

    实现方式一:实体父类

    一个用于VO继承的父对象,实现了一个Validate方法,可以抛出自定义异常,然后把违背约束的属性给输出出来

     package com.suixingpay.dim.producersdk.entity;
     
     
     import com.suixingpay.dim.producersdk.exception.ParamErrorExcaption;
     
     import java.io.Serializable;
     import java.util.HashMap;
     import java.util.Map;
     import java.util.Set;
     
     import javax.validation.ConstraintViolation;
     import javax.validation.Validation;
     import javax.validation.Validator;
     import javax.validation.groups.Default;
     
     
     public class BaseEntity implements Serializable, Cloneable {
     
         private static final long serialVersionUID = 1L;
     
         /** 得到一个验证器实例 **/
         private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
     
         /** 验证方法,抛出自定义异常 **/
         public void validate() throws ParamErrorExcaption {
             //用Map保存错误
             Map<String, StringBuffer> errorMap = null;
             //把对象放到验证器的验证方法中,用Set存储违背约束的对象
             Set<ConstraintViolation<BaseEntity>> set = validator.validate(this, Default.class);
             //当有违背约束的对象时
             if (set != null && set.size() > 0) {
                 //初始化map
                 errorMap = new HashMap<String, StringBuffer>();
                 //保存错误属性
                 String property = null;
                 for (ConstraintViolation<BaseEntity> cv : set) {
                     // 这里循环获取错误信息,可以自定义格式
                     property = cv.getPropertyPath().toString();
                     if (errorMap.get(property) != null) {
                         errorMap.get(property).append("," + cv.getMessage());
                    } else {
                         StringBuffer sb = new StringBuffer();
                         sb.append(cv.getMessage());
                         errorMap.put(property, sb);
                    }
                }
     
                 if (errorMap != null) {
                     StringBuffer sb = new StringBuffer();
                     for (Map.Entry<String, StringBuffer> m : errorMap.entrySet()) {
                         sb.append(m.getKey()+m.getValue().toString()).append(" ");
                    }
                     //输出
                     throw new ParamErrorExcaption(sb.toString());
                }
     
            }
     
        }
     
     }

    自定义异常类

     package com.suixingpay.dim.producersdk.exception;
     
     public class ParamErrorExcaption extends Exception{
     
         private int value;
     
         public ParamErrorExcaption() {
             super();
        }
     
         public ParamErrorExcaption(String message, int value) {
             super(message);
             this.value = value;
        }
     
     
         public ParamErrorExcaption(String message) {
             super(message);
        }
     
         public int getValue() {
             return value;
        }
     }

    实现方式二:工具类

    封装成工具类

      
     package com.alibaba.banff.web.util;
     
     import java.util.HashMap;
     import java.util.Map;
     import java.util.Set;
     
     import javax.validation.ConstraintViolation;
     import javax.validation.Validation;
     import javax.validation.Validator;
     import javax.validation.groups.Default;
     
     /**
      * 校验工具类
      *
      * @author lizhilong
      */
     public class ValidationUtils {
     
         private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
     
         public static <T> ValidationResult validateEntity(T obj) {
             ValidationResult result = new ValidationResult();
             Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
             // if( CollectionUtils.isNotEmpty(set) ){
             if (set != null && set.size() != 0) {
                 result.setHasErrors(true);
                 Map<String, String> errorMsg = new HashMap<String, String>();
                 for (ConstraintViolation<T> cv : set) {
                     errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage());
                }
                 result.setErrorMsg(errorMsg);
            }
             return result;
        }
     
         public static <T> ValidationResult validateProperty(T obj, String propertyName) {
             ValidationResult result = new ValidationResult();
             Set<ConstraintViolation<T>> set = validator.validateProperty(obj, propertyName, Default.class);
             if (set != null && set.size() != 0) {
                 result.setHasErrors(true);
                 Map<String, String> errorMsg = new HashMap<String, String>();
                 for (ConstraintViolation<T> cv : set) {
                     errorMsg.put(propertyName, cv.getMessage());
                }
                 result.setErrorMsg(errorMsg);
            }
             return result;
        }
     }

    校验工具类返回的数据ValidationResult(省略getset):

      
     package com.aliyun.prophet.facade.partner.flaw;
     
     import java.util.Map;
     
     /**
      * 校验结果
      *
      * @author lizhilong
      */
     public class ValidationResult {
     
         // 校验结果是否有错
         private boolean             hasErrors;
     
         // 校验错误信息
         private Map<String, String> errorMsg;
     }

     

    其他方式

    (也可以使用:Hibernate Validator是一个hibernate独立的包,可以直接引用,他实现了validation bean同时有做了扩展,比较强大。

     <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>5.4.1.Final</version>
     </dependency>

    )

    JSR303校验类型说明

     空检查
     @Null       验证对象是否为null
     @NotNull    验证对象是否不为null, 无法查检长度为0的字符串
     @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
     @NotEmpty 检查约束元素是否为NULL或者是EMPTY.
     
     Booelan检查
     @AssertTrue     验证 Boolean 对象是否为 true  
     @AssertFalse    验证 Boolean 对象是否为 false  
     
     长度检查
     @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
     @Length(min=, max=) Validates that the annotated string is between min and max included.
     
     日期检查
     @Past           验证 Date Calendar 对象是否在当前时间之前  
     @Future     验证 Date Calendar 对象是否在当前时间之后  
     @Pattern    验证 String 对象是否符合正则表达式的规则
     
     数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
     @Min            验证 Number String 对象是否大等于指定的值  
     @Max            验证 Number String 对象是否小等于指定的值  
     @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
     @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
     @Digits     验证 Number String 的构成是否合法  
     @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
     
     @Range(min=, max=) 检查数字是否介于min和max之间.
     @Range(min=10000,max=50000,message="range.bean.wage")
     private BigDecimal wage;
     
     @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
     @CreditCardNumber信用卡验证
     @Email  验证是否是邮件地址,如果为null,不进行验证,算通过验证。
     @ScriptAssert(lang= ,script=, alias=)
     @URL(protocol=,host=, port=,regexp=, flags=)

     

  • 相关阅读:
    《阿里感悟》- 技术人员的职业规划
    DIV Vue-cil脚手架
    Django PIL模块(生成随机验证码)
    Django auth模块(用户认证组件)
    Django 数据处理流程
    Django 中间件
    Django ORM (2)
    Django组件——Form
    Django orm
    Django urls
  • 原文地址:https://www.cnblogs.com/kinglead/p/10979443.html
Copyright © 2011-2022 走看看