结果校验方法_我是怎么进行SpringMVC参数校验的?

前语:

不要为了读文章而读文章,一定要带着问题来读文章,勤思考。

4f373bfaed47bcf89a0507c68fea933c.png

在 Web 开发中, 我们经常需要校验各种参数,这是一件繁琐又重要的事情,对于很多人来说,在做参数校验的时候,会有以下几种类型的处理方式。

甩锅型

校验太麻烦了,让客户端去负责校验就行了,调用方传错了是调用方的问题,不是服务的问题,甩个 500 错误让他们好好反省:

c1fb9dcd4396c23a2906eb301307766f.png

劳模型

有多少参数,我就写多少个 if 语句做判断,校验不通过的都写一句友好的提示,如:

8c762e50138adcbd9baef83427acaaf5.png

工具型

自己写个参数校验的通用工具,然后每个请求接收到的参数都调用工具方法来校验,校验不通过就把校验结果返回给调用方:。

c6aa8ff887da9f788e7c92ae9bf11bbf.png

半自动型

对 SpringMVC 了解比较全面的朋友都知道,它支持 Bean Validation,因此可以通过使用 javax.validation.constraints 包下的注解,如 @NotNull@Max@Min 等,来实现由框架处理数据校验。

首先,添加 hibernate-validator 依赖(SpringBoot 已经为我们自动添加了)。

org.hibernate.validator hibernate-validator 6.0.10.Final

然后,在参数对象的字段上打注解:

9a8b9d1f3bbcd46ec350b54a23d27c23.png

最后,在 Controller 中给参数对象添加 @Valid 注解,并处理校验结果:

Tip:如果你的参数不是对象,一定要在 Controller 上打 @Validated 注解!

678efe5e84e0e57fa4fcff7d75a7e577.png

这样做,每个 Controller 方法都要处理结果,也是很麻烦。

方案分析

以上这些处理方式都有不足之处:

首先,参数校验是一件非常重要的事,客户端要把住第一道防线,而服务方要采取不信任的态度,做好参数校验。否则非法请求参数小则影响用户体验或者产生垃圾数据,大则会拖跨整个系统!

其次,手工对所有的参数进行校验相当繁琐,容易出错,而且 So boring~

最后,通过工具来完成是比较好的方式,但是必须让工具变得优雅一些。

那么,有没有更好的解决方案呢?答案是:有的!

最佳实践

其实,上面的半自动型的解决方式,只要再进一步,就可以实现全自动了!

想想,如果上面的半自动型例子中,我们不在 Controller 方法中处理校验结果,会怎么样呢?答案是,会抛出异常:

46080359801600fbbbea1790b2e760be.png

那么,如果我们做了全局统一异常处理,不就可以实现自动校验并返回我们想要的结果了吗?所以我们可以这样做:

@ControllerAdvicepublic class GlobalExceptionHandler { /** 统一处理参数校验异常 */ @ExceptionHandler @ResponseBody public ResultBean> handleValidationException(BindException e) { // 获取 String msg = e.getBindingResult().getAllErrors().stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.joining(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值