|
简介: 在日常的开发中,**参数校验**是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性。也会减少对接时不必要的沟通。比如说:在对接的时候前端动不动就甩个截图过来说接口有问题,你检查了半天发现前端传递的参数有问题。针对以上:今天给大家分享一下**SpringBoot**如何实现统一参数校验。
前言
在日常的开发中,参数校验是非常重要的一个环节,严格参数校验会减少很多出bug的概率,增加接口的安全性。也会减少对接时不必要的沟通。比如说:在对接的时候前端动不动就甩个截图过来说接口有问题,你检查了半天发现前端传递的参数有问题。针对以上:今天给大家分享一下SpringBoot如何实现统一参数校验。
实现方式 使用 @Validated注解配合参数校验注解, 比如:@NotEmpty对参数进行校验。然后对抛出的异常ControllerAdvice进行捕获然后调整输出数据。
TestController
- @RestController
- public class TestController {
- /**
- * 表单请求
- * @param form 请求参数
- * @return 响应数据
- */
- @PostMapping("/formRequest")
- public ResultVo formRequest(@Validated RequestForm form){
- return ResultVoUtil.success(form);
- }
- /**
- * JSON请求
- * @param form 请求参数
- * @return 响应数据
- */
- @PostMapping("/jsonRequest")
- public ResultVo jsonRequest(@RequestBody @Validated RequestForm form){
- return ResultVoUtil.success(form);
- }
- }
复制代码
RequestForm
- @Data
- public class RequestForm {
- @NotEmpty(message = "姓名不能为空")
- private String name;
- @Min(value = 1 , message = "年龄不能小于1岁")
- private Integer age;
- @NotEmpty(message = "性别不能为空")
- private Integer sex;
- }
复制代码
测试结果
这个时候SpringBoot已经根据校验注解对参数进行校验了。并且输出了一大堆的错误信息。这个时候前端在对接的时候看到这样的错误信息,反手就是给你截个图告诉你接口有问题。所以这个时候就该使用 ControllerAdvice规范异常返回信息了。
ControllerAdvice
- @Slf4j
- @RestControllerAdvice
- public class ControllerAdvice {
- /**
- * 拦截表单参数校验
- */
- @ResponseStatus(HttpStatus.OK)
- @ExceptionHandler({BindException.class})
- public ResultVo bindException(BindException e) {
- BindingResult bindingResult = e.getBindingResult();
- return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
- }
-
- /**
- * 拦截JSON参数校验
- */
- @ResponseStatus(HttpStatus.OK)
- @ExceptionHandler(MethodArgumentNotValidException.class)
- public ResultVo bindException(MethodArgumentNotValidException e) {
- BindingResult bindingResult = e.getBindingResult();
- return ResultVoUtil.error(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
- }
- }
复制代码
@RestControllerAdvice会将返回的数据以json输出,如果不需要可以使用@ControllerAdvice
案例
- @Data
- public class ExampleForm {
- @NotEmpty(message = "姓名不能为空")
- @Length(min = 1 , max = 10 , message = "名字长度1~10")
- private String name;
- @Range(min = 1 , max = 99 , message = "年龄范围在1~99岁")
- private Integer age;
- @Pattern(regexp = "^[1][3,4,5,7,8][0-9]{9}$" , message = "电话号码有误")
- private String phone;
- @Email(message = "邮箱格式有误")
- private String email;
- @Valid
- @Size(min = 1 ,max = 10 , message = "列表中的元素数量为1~10")
- private List<RequestForm> requestFormList;
- @Future(message = "开始时间必须大于当前时间")
- private Date beginTime;
-
- }
复制代码
实现嵌套验证
在实际的开发中,前台会后台传递一个list,我们不仅要限制每次请求list内的个数,同时还要对list内基本元素的属性值进行校验。这个时候就需要进行嵌套验证了,实现的方式很简单。在list上添加@Vaild就可以实现了。
- @Data
- public class JsonRequestForm {
-
- @Vaild
- @Size(min = 1 ,max = 10 , message = "列表中的元素数量为1~10")
- private List<RequestForm> requestFormList;
-
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|