Validation校验参数-API、自定义、手动校验

  • Validation校验参数-API、自定义、手动校验
    • 依赖
    • 约束性注解
    • @Validated与@Valid的简单对比说明
    • Demo
    • 校验
      • 自动校验
      • 手动校验
    • 全局异常拦截
    • 自定义异常
      • 日期格式
      • 查库的

Validation校验参数-API、自定义、手动校验

依赖

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

约束性注解

注解 作用
@Null 被注释的元素_值必须为 null
@NotNull 被注释的元素_值必须不为 null
@Pattern(regex=) 被注释的元素字符串_必须符合指定的正则表达式
@Size(max=, min=) 集合元素数量必须在min和max范围内
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Range(min,max) 数字必须在min和max范围内
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Email 字符串必须是Email地址
@SafeHtml 字符串必须是安全的html
@URL 字符串必须是合法的URL
@CreditCardNumber(ignoreNonDigitCharacters=) 字符串必须是信用卡号,按照美国的标准验证
@Size(max,min) 限制字符长度必须在min到max之间

@Validated与@Valid的简单对比说明

@Valid注解与@Validated注解功能大部分类似;两者的不同主要在于:@Valid属于javax下的,而@Validated属于spring下;@Valid支持嵌套校验、而@Validated不支持,@Validated支持分组,而@Valid不支持

Demo


import lombok.Data;
import lombok.ToString;import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;@Data
@ToString
public class DevEquipment {@NotBlank(message = "aa")@Min(value = 6, message = "aa")private String a;@NotBlank(message = "bb")@Size(min = 6,message = "bb")private String b;@NotBlank(message = "cc")@Pattern(regexp = "1|2|3", message = "cc")private String c;@Email(message="非法邮件地址")private String email;}

校验

自动校验

Controller添加@Valid或者@Validated都可以

@RestController
@RequestMapping("/")
public class UserController {@RequestMapping("testValidation")public String testValidation(@Valid @RequestBody DevEquipment devEquipment) {return "success";}
}

手动校验

 private String validateDevEquipment(DevEquipment devEquipment) {//先进行参数校验StringBuilder returnSb = new StringBuilder();Set<ConstraintViolation<DevEquipment>> validateResult = Validation.buildDefaultValidatorFactory().getValidator().validate(devEquipment, Default.class);if (validateResult.size() > 0) {Iterator<ConstraintViolation<DevEquipment>> it = validateResult.iterator();while (it.hasNext()) {ConstraintViolation<DevEquipment> cv = it.next();returnSb.append(cv.getPropertyPath() + ":" + cv.getMessage()).append(";");}}return returnSb.toString();}

全局异常拦截

/*** 参数合法性校验异常* @param exception* @return*/
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
public String validationBodyException(MethodArgumentNotValidException exception){StringBuffer buffer = new StringBuffer();BindingResult result  = exception.getBindingResult();if (result.hasErrors()) {List<ObjectError> errors = result.getAllErrors();errors.forEach(p ->{FieldError fieldError = (FieldError) p;log.error("Data check failure : object{"+fieldError.getObjectName()+"},field{"+fieldError.getField()+"},errorMessage{"+fieldError.getDefaultMessage()+"}");buffer.append(fieldError.getDefaultMessage()).append(",");});}BaseResponse response = new BaseResponse(BusinessCodeEnum.INVALID_PARAM);response.setRespMsg(buffer.toString().substring(0, buffer.toString().length()-1));return JSONObject.toJSONString(response);
}

自定义异常

日期格式

import org.apache.commons.lang3.StringUtils;import javax.validation.*;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.text.SimpleDateFormat;import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;/*** @author 67546*/
@Documented
@Constraint(validatedBy = {DateValid.DateValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@ReportAsSingleViolation
public @interface DateValid {String message() default "日期格式不正确";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};/*** 有效的日期格式*/String[] format() default {};@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})@Retention(RUNTIME)@Documented@interface List {DateValid[] value();}class DateValidator implements ConstraintValidator<DateValid, String> {private String[] formats;@Overridepublic void initialize(DateValid constraintAnnotation) {formats = constraintAnnotation.format();}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if(StringUtils.isBlank(value)){return true;}if (formats.length == 0) {return true;}for (String string : formats) {try {SimpleDateFormat formatter = new SimpleDateFormat(string);formatter.parse(value);} catch (Exception e) {return false;}}return true;}}
}

查库的

import cn.hutool.extra.spring.SpringUtil;
import com.zjhcsoft.mapper.UseUnitMapper;
import org.apache.commons.lang3.StringUtils;import javax.validation.*;
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;/*** @author Ybb* @Classname UseUnitCodeVScope* @Description TODO* @Date 2022/2/8 15:49* @Created by Ybb*/@Documented
@Constraint(validatedBy = {UseUnitCodeScope.UseUnitCodeValidator.class})
@Target({TYPE, ANNOTATION_TYPE, FIELD})
@Retention(RUNTIME)
@ReportAsSingleViolation
public @interface UseUnitCodeScope {String message() default "{xx}";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};class UseUnitCodeValidator implements ConstraintValidator<UseUnitCodeScope, String> {private UseUnitMapper useUnitMapper;@Overridepublic void initialize(UseUnitCodeScope constraintAnnotation) {this.useUnitMapper = SpringUtil.getBean("useUnitMapper");}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if(StringUtils.isBlank(value)){return false;}int count = useUnitMapper.queryUseUnitCode(value);if (count > 0) {return true;}return false;}}
}

Validation校验参数-API、自定义、手动校验相关推荐

  1. Spring Boot 如何优雅的校验参数?

    今天介绍一下 Spring Boot 如何优雅的整合JSR-303进行参数校验,说到参数校验可能都用过,但网上的教程大多是简单的介绍,所以我们今天详细看来一下 . 什么是 JSR-303? JSR-3 ...

  2. spring-java使用Validation参数验证-自定义校验器

    在开发JAVA服务器端代码时,我们会遇到对外部传来的参数合法性进行验证,而hibernate-validator提供了一些常用的参数校验注解,我们可以拿来使用. spring-boot-web,内嵌了 ...

  3. bean validation校验方法参数_Spring Boot 之使用 validation 验证参数

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了 ...

  4. e0312 不存在用户定义的_更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

  5. java数据校验博客_springmvc教程:利用Validation进行参数校验

    上传图片 1.1 配置虚拟目录 1.2 配置解析器 Validation校验 b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务 ...

  6. 粉丝说SpringBoot集成validation校验参数有坑,我试了试

    公众号中分享了一篇文章,关于SpringBoot集成validation校验参数的,粉丝留言说有坑. 原留言如下: 有坑,你试试^A-\\d{12}-\\d{4}$,这条正则经过validate这个方 ...

  7. Java自定义注解实现校验参数不能为空

    文章目录 前言 1 自定义注解 NotNull 2 使用接口实现 NotNull注解的功能 3 测试效果 4 控制台的异常栈信息 前言 关于参数校验,一直是个困扰人的事.这次使用注解+反射,实现自己的 ...

  8. java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...

  9. 求求你别在用IF ELSE校验参数了

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 本文看点 前言 验证数据是贯穿所有应用程序层(从表示层到 ...

最新文章

  1. Python匿名函数:lamdba()函数
  2. 【Harvest源码分析】GetFilteredSignal函数
  3. [新产品发布|推广] 赠书活动来了,参与有机会得《产品经理那些事儿》图书!...
  4. python 字符串操作_python中字符串的常见操作(一)
  5. UVA - 11572
  6. elementUi Dialog 对话框使用中数据获取问题
  7. *【POJ - 3659】Cell Phone Network (树形dp,最小支配集)
  8. CCNA12月12日战报
  9. anaconda学python的教程_初学 Python 者自学 Anaconda 的正确姿势是什么?
  10. java 盲水印_3步搞定图像盲水印?试试云开发扩展能力
  11. GitLab之不允许用户注册-yellowcong
  12. 图相关论文阅读与总结
  13. JavaScript 使用
  14. lol英雄全皮肤爬取
  15. 出方向链路负载均衡技术(原理部分)
  16. 百度图片批量下载助手
  17. 九峰影业创始人_以终为始 逐梦青春——九峰实验学校2020届高三毕业典礼
  18. ☆苹果MAC OS X ★ 安装双系统☆
  19. 全新二开PHP自适应极简多引擎搜索单页网站源码
  20. win10可以上网但是网路连接显示小地球(无法连接到Internet)

热门文章

  1. bt客户端 linux 上传,linux下飞快的BT客户端rtorrent设置:详细解说
  2. mysql手动对表或记录进行上锁处理
  3. win10更新补丁后造成wifi共享笔记本无法联网情况
  4. zz:如何更改列表项前的New标记的天数设置(days-to-show-new-icon ) from Jianyi
  5. C++模拟商店货物购进和卖出
  6. 【自学习】- 怎么让对话机器人越来越强?
  7. 中国中药专利数据库检索系统(CTCMPD)
  8. 基于PHP+MySQL医院在线预约平台系统的设计与开发
  9. 基于卷积神经网络的CSI步态信息研究(附源码地址)
  10. ubuntu 系统里面原来可以输入中文,突然输入法不能输入中文,但是搜索框内可以输入中文!解决办法