栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring Validation 使用笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring Validation 使用笔记

Spring Validation 使用笔记
  • 一、前言
  • 二、常用注解
  • 三、校验方式
  • 四、问题记录

一、前言

  最早在传统Spring MVC项目里,因为前端对接数据都是后端程序员自己对接的,入参很明确,后端的参数校验自然可有可无,主要看项目的安全要求和工期要求。因此后端参数校验虽然很早就用,但是断断续续,不甚了了。
  这几年,项目基本都是前后端分离模式,后端必要的参数校验自然不可少。每次使用,总是要在网上查找相应注解;同时有些不常用用法或奇怪BUG在做完后没及时总结,再一次遇到才后悔莫及。
  因此,开一篇专门的笔记,来记录常用的注解和用法以供工作中查阅,希望能坚持逐渐完善吧。

二、常用注解
注解作用
@Null验证对象是否为 null
@NotNull验证对象是否不为 null, 无法查检长度为 0 的字符串
@NotBlank字符串不为null,并且字符串trim()以后length要大于0
@NotEmpty集合或字符串不为空
@AssertTrueBoolean 对象是否为 true
@AssertFalseBoolean 对象是否为 false
@Size(min=, max=)验证对象(Array, Collection , Map, String)长度是否在给定的范围之内
@Length(min=, max=)验证字符串长度介于 min 和 max 之间
@Past验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
@PastOrPresent过去或者现在
@Future验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
@FutureOrPresent将来或者现在
@Min验证 Number 和 String 对象是否大等于指定的值
@Max验证 Number 和 String 对象是否小等于指定的值
@DecimalMax被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过 BigDecimal定义的最大值的字符串表示 .小数 存在精度
@DecimalMin被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过 BigDecimal定义的最小值的字符串表示 .小数 存在精度
@Digits(integer=,fraction=)数字格式检查。integer指定整数部分的最大长度,fraction指定小数部分的最大长度
@Positive数字,正数
@PositiveOrZero数字,正数或0
@Negative数字,负数
@NegativeOrZero数字,负数或0
@Range(min=, max=)被指定的元素必须在合适的范围内
@Pattern(regex=)字符串必须匹配正则表达式
@Valid嵌套验证、级联验证,如对象属性
三、校验方式
  • 1、在Controller方法参数前加@Valid注解
    • a)此处,@Valid 可以换成 @Validated;这两个有一些细节差别,待后期使用中完善吧;
    • b) @Valid 位置也可以放置在方法上或类上,产生的验证范围会发生变化,习惯放于参数前,更灵活。
    • c) 在验证参数后面加 BindingResult bindingResult,bindingResult会自动接收错误信息。
  • 2、 手动校验
    • a) 如果我们的数据不是来自接口传值,没有通过Controller层,但是又希望验证 Bean的参数有效性,那么可以通过手动调用 ValidatorFactory 来进行校验;
    • b) 示例如下:
    // Bean 验证器
    ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
    Validator validator = vf.getValidator();
    // 校验的业务对象:demo,Bean 类型:Demo
    Set> checkSet = validator.validate(demo);
    if (CollectionUtils.isNotEmpty(checkSet)) {
        // Bean验证不通过
        throw new ServiceException(checkSet.stream().map(ConstraintViolation::getMessage).collect(Collectors.joining(",")));
    }
    
四、问题记录
  • 1、 级联验证
    • a) 在Bean中存在对象属性或集合属性,需要级联验证对象中的属性时,需在属性上加“@Valid”注解,之前犯过傻,记录一下;
    • b) 示例如下:
    public class DemoDto {
    
    @Size(min = 1, message = "集合为空")
    @Valid
    private List list;
    
  • 2、 List 集合参数验证
    • a) 可能遇到如下情况,保存一组数据,所以入参是对象集合,示例如下:
    • b) 这种情况,想要验证集合非空及对象的属性有效性,常规方式是无效的;
    • c) 参照网上的解决方式(未验证),既然集合在对象里可以级联验证,那么我们自定义一个集合类,实现List接口,示例如下:
    // 定义校验集合类
    public class ValidatorList implements List {          
    	@Valid     
        private List list;      
             
        public List getList() {         
        	return list;     
        }     
             
        public void setList(List list) {         
            this.list = list;    
        }     
        public ValidatorList() {         
            this.list = new ArrayList();     
        }      
        public ValidatorList(List list) {        
        	this.list = list;    
        } 
    }
    
    // 使用新集合类接收参数
    // 控制器
    @RequestMapping(value = "/save", method = RequestMethod.POST)
    @ResponseBody
    public int save(@Validated @RequestBody ValidList list, BindingResult bindingResult) {
        // 省略业务代码
    }
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975796.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号