关于Validation框架:(官方简介)

在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是正确的。在通常的情况下,应用程序是分层的,不同的层由不同的开发人员来完成。很多时候同样的数据验证逻辑会出现在不同的层,这样就会导致代码冗余和一些管理的问题,比如说语义的一致性等。为了避免这样的情况发生,最好是将验证逻辑与相应的域模型进行绑定。

Bean Validation 为 JavaBean 验证定义了相应的元数据模型和 API。缺省的元数据是 Java Annotations,通过使用 XML 可以对原有的元数据信息进行覆盖和扩展。在应用程序中,通过使用 Bean Validation 或是你自己定义的 constraint,例如 @NotNull@Max@ZipCode, 就可以确保数据模型(JavaBean)的正确性。constraint 可以附加到字段,getter 方法,类或者接口上面。对于一些特定的需求,用户可以很容易的开发定制化的 constraint。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。

Bean Validation中的约束

表1. Bean验证中内置的约束

约束 详细信息
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式

表2. Hibernate Validator附加的约束

约束 详细信息
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内

一个 constraint 通常由 annotation 和相应的 constraint validator 组成,它们是一对多的关系。也就是说可以有多个 constraint validator 对应一个 annotation。在运行时,Bean Validation 框架本身会根据被注释元素的类型来选择合适的 constraint validator 对数据进行验证。

关于自定义校验器可以看下面两个链接:

在有时候我们需要对一些字段进行特殊校验比如 Phone 进行校验下面查看代码:

maven:

    <!--validation校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>

需要校验的 bean:

import com.demo.miaosha.validate.IsMobile;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotNull;@Data //此注解是lombox插件,用于生产set和get以及toString等方法
public class LoginVo {@NotNull //不能为空@IsMobile //自定义注解校验是否满足手机号格式private String mobile;@NotNull //不能为空@Length(min = 32) //指定长度private String password;
}

自定义校验注解:

package com.demo.miaosha.validate;import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;@Target({TYPE, METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })// 约束注解应用的目标元素类型(TYPE   ,METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER等)
@Retention(RUNTIME)// 约束注解应用的时机
@Documented
@Constraint(validatedBy = { IsMobileValidator.class})// 与约束注解关联的验证器
public @interface IsMobile {boolean required() default true;//是否校验String message() default "手机号码错误"; // 约束注解验证时的输出消息Class<?>[] groups() default { };// 约束注解在验证时所属的组别Class<? extends Payload>[] payload() default { };// 约束注解的有效负载
}

校验器实现类:

import com.demo.miaosha.utils.ValidatorUtil;
import org.thymeleaf.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {private boolean required = false;//初始化方法@Overridepublic void initialize(IsMobile constraintAnnotation) {required = constraintAnnotation.required();}//校验方法@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if (required == false) {return ValidatorUtil.isMobile(value);}else {if (StringUtils.isEmpty(value)) {return true;}return ValidatorUtil.isMobile(value);}}
}

校验器的 Util:

import org.thymeleaf.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 手机号格式校验*/
public class ValidatorUtil {//手机号格式表达式private static final Pattern mobile_pattern = Pattern.compile("1\\d{10}");/*** 校验src是否为指定的手机号格式* @param src 需要校验的手机号* @return 是指定的手机号返回true,否则false*/public static boolean isMobile(String src){if (StringUtils.isEmpty(src)){return false;}Matcher m = mobile_pattern.matcher(src);return m.matches();}
}

需要校验的 LoginVo 参数:使用 @Valid 注解校验 LoginVo 参数

    /*** 登录* @param vo 前端返回过来用户账号和密码* @return 登录成功的信息or失败信息*/@RequestMapping(path="/do_login",method=RequestMethod.POST)@ResponseBodypublic Result do_login(@Valid LoginVo vo){log.info(vo.toString());String mobile = vo.getMobile();String password = vo.getPassword();ResultEnum resultEnum = miaoshaUserService.login(mobile,password);if (resultEnum.getCode() == 0){return Result.SUCCESS(resultEnum);}else {return Result.ERROR(resultEnum);}}

对校验异常捕获代码:

import com.demo.miaosha.common.ResultEnum;
import com.demo.miaosha.result.Result;
import lombok.extern.java.Log;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.List;@ControllerAdvice//所谓加强Controller就是@ControllerAdvice注解,有这个注解的类中的方法的某些注解会应用到所有的Controller里,其中就包括@ExceptionHandler注解。
@ResponseBody//REST风格接口
@Log//lombox插件中的日志注解
public class GlobleExceptionHandler {@ExceptionHandler(value = Exception.class)//异常处理(@ControllerAdvice注解注释的controller层和此注解注释的方法,会对所有controller层抛出的异常进行统一处理)public Result<String> ExceptionHandler(HttpServletRequest request, Exception e){if (e instanceof BindException){BindException ex = (BindException)e;List<ObjectError> allErrors = ex.getAllErrors();//捕获的所有错误对象ObjectError error = allErrors.get(0);String defaultMessage = error.getDefaultMessage();//异常内容log.info(defaultMessage);//打印日志return Result.ERROR(ResultEnum.BIND_ERROR,defaultMessage);}else {return Result.ERROR(ResultEnum.ERROR);}}
}

异常处理LINK:

注解完成异常处理LINK: https://www.jianshu.com/p/12e1a752974d

SpringMVC异常处理LINK: https://blog.csdn.net/qq_40325734/article/details/80793792

自定义Validation校验器LINK:

LINK:https://blog.csdn.net/ZZY1078689276/article/details/79064835

官网 LINK:https: //www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html

SpringBoot使用Validation框架完成参数校验AND异常处理相关推荐

  1. springboot+dubbo+validation 进行 rpc 参数校验

    注意:本文dubbo 版本 2.8.4 springboot 版本 2.0.4.RELEASE 项目结构 test-rest (前端消费着,controller 层,springboot+maven项 ...

  2. SpringBoot - 优雅的实现【参数校验】高级进阶

    文章目录 Pre 概述 参数校验三部曲 Step1 搞依赖 Step2 搞参数校验的实体类 常用的校验注解 Step3 开始验证 存在的问题 使用 统一格式 + 全局异常Handler 优化 源码 P ...

  3. SpringBoot Validation优雅的参数校验

    前言:大多数项目中都需要后台对传过来的对象进行校验,所以经常需要写一些字段校验的代码,比如特殊字段非空.字段长度限制和邮箱格式验证等等.之前我们可能都是使用if-else-,写这些与业务逻辑关系不大的 ...

  4. Spring Validation实现原理,参数校验没那么简单

    前言 本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底! 项目源码:spring-validation 简单使用 Java API规范(JSR303)定义了B ...

  5. SpringBoot实现通用的接口参数校验

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:cipher juejin.im/post/5af3c25b ...

  6. java 参数校验 优雅的,SpringBoot 如何优雅的进行参数校验

    参数的合法性直接影响到程序的安全和性能,因此在进行相关操作前必须检测对象是否为null,是否为blank,是否被初始化等等. 我们先来看看SpringBoot 是如何来检验参数的. 验证总是摆在第一位 ...

  7. SpringBoot - 优雅的实现【参数分组校验】高级进阶

    文章目录 Pre 需求 实现三部曲 Step1 定义分组接口 Step2 给参数分配分组 Step3 指定分组 Step4 验证 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  8. SpringBoot - 优雅的实现【自定义参数校验】高级进阶

    文章目录 Pre 概述 三部曲 Step1 搞自定义注解 Step2 搞校验逻辑 Step3 使用 Step4 验证 附 int 类型的判断 源码 Pre SpringBoot - 优雅的实现[参数校 ...

  9. Springboot 参数校验@Valid @Validated(最新最全)

    Springboot 参数校验@Valid @Validated(最新最全) 提示:统一参数校验,异常处理 文章目录 Springboot 参数校验@Valid @Validated(最新最全) 前言 ...

最新文章

  1. 【Spring】spring基于注解的声明式事务控制
  2. Confluence 6 计划任务
  3. Asp.Net 中使用客户端Activex控件需要注意的事情
  4. MySql入门知识(一)
  5. python mac 安装pillow,关于python:安装了Pillow,但仍然得到“ImportError:没有名为PIL的模块”...
  6. [转]PHP程序61条面向对象分析设计的经验原则
  7. 2013年第四届蓝桥杯C/C++ A组国赛 —— 第四题:约数倍数选卡片
  8. 深入浅出LVS:企业集群平台负载均衡的三种模式和算法实现
  9. 【dlib库】进行人脸检测+人脸关键点检测+人脸对齐
  10. TCP的三次握手和四次挥手理解及面试题
  11. python numpy数据类型_Python中numpy的数据类型,python,dtype
  12. 如何用Python脚本从文件读取数据?
  13. 并联机构逆运动学用MapleSim符号来解决
  14. 基于张量分解的药物重定位预测药物、靶点和疾病之间的关联
  15. 安装免费在线客服livezilla系统
  16. 六十分之七——焦虑路上的涅槃
  17. 安装Photoshop后,打开方式里没有“Photoshop”选项的解决办法
  18. CentOS7 安装Samba
  19. T1114 白细胞计数(信息学一本通C++)
  20. 商务口语 - 意见分歧话题

热门文章

  1. linux复制文件scp命令,Linux 中的文件复制cp命令和scp命令详解
  2. php培训 pdf,php生成pdf
  3. nginx异步非阻塞 解析
  4. 分析区块链开发技术的优缺点
  5. AGAL 的学习记录
  6. 联迪商用入围通联支付2017年度POS设备集中采购
  7. Pandas中的map(), apply()和applymap()的应用
  8. 你面试过程中的内心独白(推荐传阅)
  9. 12cR1通过unplug与plug方式升级PDB数据库到19c
  10. 科学计算机 标准差,用科学计算器计算方差和标准差