入参校验,你还在写 If-Else?Out了!快来看看这个吧

背景

当服务端接口一拿到前台的入参校验入参,你是还写不是上去就开始堆积if-else,十多行代码下去,入参校验发现全判断校验参数了,还写还没进入正常的入参校验业务逻辑。虽然功能没啥毛病,还写但看起来太冗长,亿华云入参校验被后来者看到,还写那是入参校验免不了一顿吐槽的!想要优雅一点吗?那就一起随小编一起来学习使用

spring-boot-starter-validation进行参数校验!

优点

controller层的代码看起来干净整洁spring-boot-starter-validation本身内置了一些注解可以直接使用,比如@NotNull,还写@NotBlank,入参校验@Size等支持自定义注解,还写灵活方便

搭建

pom引入依赖包

org.springframework.boot

spring-boot-starter-validation

</dependency>

常用注解

@NotNull

@NotBlank

@NotEmpty

@Size

自定义注解

/

**

* 时间属性格式校验

* @author:liyajie

* @createTime:2022/1/20 10:38

* @version:1.0

*/

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target({ ElementType.PARAMETER,入参校验ElementType.FIELD})

@Constraint(validatedBy = DateValidator.Validator.class)

public @interface DateValidator {

// 校验未通过时的返回信息

String message() default "日期格式不正确";

// 以下两行为固定模板

Class [] groups() default { };

Class [] payload() default { };

/

**

* 预期日期格式

*/

String expectValue();

@Slf4j

class Validator implements ConstraintValidator{

private String expectValue;

@Override

public void initialize(DateValidator dateValidator) {

expectValue = dateValidator.expectValue();

}

@Override

public boolean isValid(String value, ConstraintValidatorContext context) {

boolean flag = false;

/

**

* 为空直接通过,网站模板只做格式验证

*/

if(Strings.isNullOrEmpty(value)){

return true;

}

try {

Date date = DateUtil.formatStr2Date(value,还写 expectValue);

flag = true;

}catch (RuntimeException e){

log.warn("DateValidator 日期格式不正确");

e.printStackTrace();

}

return flag;

}

}

}

测试

注意点

校验不通过时,会直接抛出异常,入参校验程序将停止执行下面的逻辑,这样是不合理的,所以我们要捕获异常,并进行处理,方案如下: 全局捕获异常,服务器托管并统一返回:

/

**

* 全局异常处理

* @author: zhanglei

* @version: 1.0

* @date: 2021/5/18 20:27

*/

@ControllerAdvice

@Slf4j

public class GlobalExceptionHandler {

/

**

* 校验异常

* @author: liyajie

* @date: 2022/1/20 13:07

* @param e

* @return com.lyj.validates.common.R

* @exception:

* @update:

* @updatePerson:

**/

@ExceptionHandler(MethodArgumentNotValidException.class)

@ResponseBody

public R exceptionHandler(MethodArgumentNotValidException e) {

log.error("exceptionHandler info:", e);

BindingResult bindingResult = e.getBindingResult();

StringBuilder builder = new StringBuilder();

for (FieldError fieldError : bindingResult.getFieldErrors()) {

builder.append(fieldError.getDefaultMessage()).append("!");

}

log.error("message : { }",builder.toString());

return new R("500",builder.toString());

}

}
滇ICP备2023000592号-31