validation[通俗易懂]

validation[通俗易懂]validation说明后台开发需要对对象的传进来的参数进行校验,有专门的校验工具,validationbean是基于JSR-303标准开发出来的,使用注解方式实现,及其方便,但是这只是一个接

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

validation

说明

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

依赖

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

注解类型

validation[通俗易懂]

实现方式一:实体父类

一个用于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("\r\n");
                }
                 //输出
                 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=)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167496.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android 新特性_Android10使用

    Android 新特性_Android10使用2016年5月19日,谷歌在美国加州的山景城举办了GoogleI/O开发者大会中发布。2016年6月,AndroidN正式命名为“牛轧糖”本届I/O开发者大会上,Google重点介绍了Android系统三个维度:分别是性能、安全和生产力。其中性能主要新增了VulkanAPI与JIT编译器(前者优化图形性能、或者加快软件安装速度);安全性包括新的数据加密方式、恶意网站识别、系统的实时更新;

    2025年9月21日
    5
  • Netty学习之读netty权威指南(一)

    Netty学习之读netty权威指南(一)大家问我为什么读这个来学netty,嗯嗯嗯??我也说不上来,因为我以前看过某个培训班的课程,初步了解了一下netty,但是现在回想一下发现我所有的知识基本忘光了,不过没关系,慢慢来,一点一点的找回来不久好了吗,现在开始咱们读一读Netty权威指南这本书,学习一下Netty。当然了不会全部按照这本书来,我会加上自己学习的东西。I/O演进之路JDK1.4以前Java对IO的支持不完…

    2022年10月2日
    2
  • 值得收藏!15个 Pythonic 的代码示例

    值得收藏!15个 Pythonic 的代码示例Python 由于语言的简洁性 让我们以人类思考的方式来写代码 新手更容易上手 老鸟更爱不释手 要写出 Pythonic 优雅的 地道的 整洁的 代码 还要平时多观察那些大牛代码 Github 上有很多非常优秀的源代码值得阅读 比如 requests flask tornado 这里小明收集了一些常见的 Pythonic 写法 帮助你养成写优秀代码的习惯 01 变量交换 Badtmp aa bb tmpPythonica b b a02 列表推导 Badmy list

    2025年6月7日
    6
  • FreeLink开源呼叫中心设计思想

    FreeLink开源呼叫中心设计思想

    2022年1月24日
    42
  • Razor语法大全(cshtml语法)

    Razor语法大全(cshtml语法)本文页面来源地址:http://www.cnblogs.com/dengxinglin/p/3352078.htmlRazor是基于framewor4以上写的一个开源项目:https://github.com/Antaris/RazorEngine/Razor是包含了模板引擎和动态编译两部分。本部分就简单记录了模板引擎的一些语法,之后用Razor做一个代码生成器,就使用Razor的语法来。Razo

    2022年6月16日
    62
  • java学生成绩管理系统界面设计

    java学生成绩管理系统界面设计关于学生成绩管理系统的界面设计:代码如下1import&nbsp;javax.swing.*;2import&nbsp;java.awt.*;3import&nbsp;java.awt.event.*;4import&nbsp;com.example.SqlHelper;5class&nbsp;MyPanel&nbsp;extends&nbsp;JPanel{6&nbsp;&nbs…

    2022年7月17日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号