基于spring boot starter 对于api请求参数做出校验的自定义starter

简介

  1. 基于spring boot starter的自动化配置特性,对于api请求参数做出校验的自定义starter
  2. 应用框架只需要加上注解例如@NotEmpty等即可,不需要写任何其他多余的代码来校验。
  3. 使用样例:https://github.com/yalunwang/demo-validator
  4. 源码:https://github.com/godgroup/summer-boot-validator

**欢迎使用,多多加star,如使用过程中碰到问题,可以提出Issue,我们会尽力完善。

如何使用

summer-boot-validator支持三种类型的请求校验

  1. 简单参数直接定义在方法入参内
1
2
3
4
@RequestMapping("/hi")
public String hi(@NotEmpty String name){
return "hi"+name;
}
  1. 定义请求request类时可以加上
1
2
3
4
5
6
7
8
9
10
public class DemoRequest {
@NotEmpty
private String name;
@NotEmpty
private String age;
//省略get set
//开发时请务必加上get set
}
  1. 支持批量执行(有些场景是需要批量操作)
1
2
3
4
5
6
7
8
public class DemoRequest {
@RequestMapping("/hi2")
public String hi2(@RequestBody List<DemoRequest> request){
return "hi"+request.get(0).getName();
}
}

必要的配置

1
2
3
4
5
6
summer-boot-validator一共需要两个配置
summer.boot.validator.errorCode=-9999 --校验的参数如不符合入参的设置抛出的错误码 默认为-9999
summer.boot.validator.enable=false --是否开启校验 默认false
如果想用使用需要开启校验 summer.boot.validator.enable=true
如果自己约定错误码 summer.boot.validator.errorCode=xxxx (自己的错误码)

捕获summer-boot-validato的异常

summer-boot-validator 如果发现入参参数不符合你的设置会抛出ValidateRuntimeException异常请在项目统一异常错误里处理一下,返回符合自己项目要求的返回,下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RestControllerAdvice
public class ExceptionAdvice {
private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionAdvice.class);
@ExceptionHandler
public ApiResponse<Object> handler(HttpServletRequest request, Exception ex) {
StringBuilder errorMessage = new StringBuilder();
Integer errorCode = 0;
if (ex instanceof ValidateRuntimeException) {
ValidateRuntimeException validateRuntimeException = (ValidateRuntimeException) ex;
errorCode = validateRuntimeException.getCode();
errorMessage.append(JSON.toJSONString(validateRuntimeException.getFailedReason()));
LOGGER.error(errorMessage.toString());
} else {
//其他异常
}
LOGGER.error(ex.getMessage(), ex);
return ApiResponse.fail(errorCode, errorMessage.toString());
}
}

扩展自己的校验器

如果本项目提供的注解校验不能满足完全满足你的校验需求,你可以自定义自己的校验器,只需要以下两个步骤即可:

  1. 定义自己的注解 eg.NotEmpty
  2. 编写注解对应的校验器 eg.
    ```java
    @Component
    public class NotEmptyValidator extends AbstractAnnotationValidator {

    @Override
    public void afterPropertiesSet() throws Exception {

    registerValidator(NotEmpty.class,this);
    

    }
    /**

    * 校验实现
    * @param notEmpty
    * @param paramName
    * @param paramValue
    * @return
    */
    

    @Override
    public ValidateResult validate(NotEmpty notEmpty, String paramName, Object paramValue){
    }
    }
    ```java

    这样你就使用这个校验注解了。