首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

补习系列-springboot 参数校验详解

目标

对于几种常见的入参方式,了解如何进行校验以及该如何处理错误消息;

了解springboot 内置的参数异常类型,并能利用拦截器实现自定义处理;

能实现简单的自定义校验规则

一、PathVariable 校验

在定义 Restful 风格的接口时,通常会采用 PathVariable 指定关键业务参数,如下:

这样的表达式指定了 group 必须是以大小写字母、数字或下划线组成的字符串。我们试着访问一个错误的路径:

此时会得到404的响应,因此对于PathVariable 仅由正则表达式可达到校验的目的

二、方法参数校验

类似前面的例子,大多数情况下,我们都会直接将HTTP请求参数映射到方法参数上。

上面的代码中,@RequestParam 声明了映射,此外我们还为 group 定义了一个规则(复合Email格式)这段代码是否能直接使用呢?答案是否定的,为了启用方法参数的校验能力,还需要完成以下步骤:

声明MethodValidationPostProcessor

Controller指定@Validated注解

如此之后,方法上的@Email规则才能生效。

校验异常

如果此时我们尝试通过非法参数进行访问时,比如提供非Email格式的 group会得到以下错误:

而如果参数类型错误,比如提供非整数的 userid,会得到:

当存在参数缺失时,由于定义的@RequestParam注解中,属性 required=true,也将会导致失败:

三、表单对象校验

页面的表单通常比较复杂,此时可以将请求参数封装到表单对象中,并指定一系列对应的规则,参考JSR-303

上面定义的属性中:

email必须非空、符合Email格式规则;

name必须为大小写字母、数字及下划线组成,长度在6-30个;

age必须在5-199范围内

Controller方法中的定义:

@Validated指定了参数对象需要执行一系列校验。

校验异常

此时我们尝试构造一些违反规则的输入,会得到以下的结果:

如果是参数类型不匹配,会得到:

Form表单参数上,使用@Valid注解可达到同样目的,而关于两者的区别:

@Valid 基于JSR303,即 Bean Validation 1.0,由Hibernate Validator实现;@Validated 基于JSR349,是Bean Validation 1.1,由Spring框架扩展实现;

后者做了一些增强扩展,如支持分组校验,有兴趣可参考这里。

四、RequestBody 校验

对于Json消息体输入,同样可以定义校验规则:

校验异常

构造一个违反规则的Json请求体进行输入,会得到:

此时与FormBinding的情况不同,我们得到了一个MethodArgumentNotValidException异常。而如果发生参数类型不匹配,比如输入age=1f,会产生以下结果:

这表明在JSON转换过程中已经失败!

五、自定义校验规则

框架内预置的校验规则可以满足大多数场景使用,但某些特殊情况下,你需要制作自己的校验规则,这需要用到ContraintValidator接口。

我们以一个密码校验的场景作为示例,比如一个注册表单上,我们需要检查密码输入密码确认是一致的。

首先定义好 PasswordEquals 注解

在表单上声明@PasswordEquals 注解

针对@PasswordEquals实现校验逻辑

如此,我们已经完成了自定义的校验工作。

六、异常拦截器

SpringBoot 框架中可通过 @ControllerAdvice 实现Controller方法的拦截操作。可以利用拦截能力实现一些公共的功能,比如权限检查、页面数据填充,以及全局的异常处理等等。

在前面的篇幅中,我们提及了各种校验失败所产生的异常,整理如下表:

如果希望对这些异常实现统一的捕获,并返回自定义的消息,可以参考以下的代码片段:

默认情况下,对于非法的参数输入,框架会产生*HTTP_BAD_REQUEST(status=400)*错误码,并输出友好的提示消息,这对于一般情况来说已经足够。

更多的输入校验及提示功能应该通过客户端去完成(服务端仅做同步检查),客户端校验的用户体验更好,而这也符合富客户端(rich client)的发展趋势。

参考文档

springmvc-validation样例

使用validation api进行操作

hibernate-validation官方文档

Bean-Validation规范

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180731G07I8A00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券