ITPub博客

首页 > 应用开发 > > 帮你少写一大半参数校验代码的小技巧

帮你少写一大半参数校验代码的小技巧

作者:cdfoxman 时间:2019-11-06 09:57:33 0 删除 编辑

介绍

几乎每个web网站都会对用户提交的参数进行校验,前端要做,后端也要做。防止用户直接通过接口调用的方式来请求或保存数据,从而导致产生脏数据等其他严重的后果。

因为有些校验的逻辑也很繁琐,为了减轻开发者的负担,Java发布了 JSR303/JSR-349数据校验规范

JSR303 是一项标准,JSR-349 是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如 @Null,@NotNull,@Pattern,他们位于 javax.validation.constraints 包下,只提供规范不提供实现。而 hibernate validation 是对这个规范的实践(不要将 hibernate 和数据库 orm 框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如 @Length,@Range 等等,他们位于 org.hibernate.validator.constraints 包下。而万能的 spring 为了给开发者提供便捷,对 hibernate validation 进行了二次封装,显示校验 validated bean 时,你可以使用 spring validation 或者 hibernate validation,而 spring validation 另一个特性,便是其在 springmvc 模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的 web 开发

在spring boot项目中只要加入如下依赖即可使用校验注解

查看子依赖会发现有如下依赖

JSR提供的部分校验注解如下

经常被搞混的3个注解

我来举一个org.apache.commons.lang3.StringUtils中的例子,你就能理解NotBlank的意思了,如下断言都能测试通过

改造一个注册的接口

先定义一下状态枚举类

定义项目的返回对象

注册接口,这里省略了一部分校验

当不满足条件时返回如下

{

"status": 2,

"msg": "用户名不能为空"

}

当参数较多,校验的逻辑也越来越多,这时可以直接将前端传过来参数直接转为对象

代码将不满足条件的字段的描述取一个出来返回,类似如下。当都满足时才会返回成功

{

"status": 2,

"msg": "用户名不能为空"

}

需要注意的地方如下

参数 Student 前需要加上@Valid或@Validated 注解(下文说这2个注解的区别),表明需要 spring 对其进行校验,而校验的信息会存放到其后的 BindingResult 中。注意,必须相邻,如果有多个参数需要校验,形式可以如下。foo(@Validated Student student, BindingResult studentBindingResult ,@Validated Bar bar, BindingResult barBindingResult); 即一个校验类对应一个校验结果。

@Validated比@Valid的功能更强大

@Validated比@Valid的功能更强大,主要体现在@Validated可以进行分组校验和嵌套校验。

如果同一个类,在不同的使用场景下有不同的校验规则,那么可以使用分组校验,用处不多,不再介绍。介绍一下嵌套校验

假如我们还要求学生填写父亲和母亲的名字(并且不能为空),而后端的设计中父亲和母亲的名字被放在另一个类Relation中,这就要求我们能进行嵌套校验。

我们要做如下2个事情

1.将方法中的@Valid注解改为@Validated

2.在relation属性上加@Valid注解

那Relation类的fatherName属性如何被赋值呢?

很简单,前端传入的参数名是如下即可

xxxx?relation.fatherName=li&relation.motherName=liu

原文链接:https://blog.csdn.net/zzti_erlie/article/details/102624957

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/625/viewspace-3139079/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    237
  • 访问量
    1739