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

开发 前端
当服务端接口一拿到前台的入参,你是不是上去就开始堆积if-else,十多行代码下去,发现全判断校验参数了,还没进入正常的业务逻辑。想要优雅一点吗?那就一起随小编一起来学习吧!

背景

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

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

优点

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

搭建

pom引入依赖包

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</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<? extends Payload>[] payload() default {};
/**
* 预期日期格式
*/
String expectValue();

@Slf4j
class Validator implements ConstraintValidator<DateValidator, String> {

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());
}
}


责任编辑:武晓燕 来源: 今日头条
相关推荐

2024-06-03 00:00:06

高性能数据传输应用程序

2022-11-28 07:32:46

迭代器remove数据库

2021-06-10 10:33:22

Jenkins持续集成工具自动化

2022-05-12 15:17:09

GPU微软神经网络

2023-10-30 08:18:21

内存泄漏Java

2024-04-29 07:59:35

2021-04-19 09:23:26

数字化

2020-08-04 07:02:00

TCPIP算法

2020-12-25 10:35:42

编程语言C语言Java

2018-02-24 14:59:39

区块链公共区块链私有区块链

2018-02-25 23:12:16

2019-12-11 16:36:09

编程语言排行榜Python

2023-06-02 07:30:24

If-else结构流程控制

2019-09-06 10:31:45

软件开发地图

2020-05-13 14:15:25

if-else代码前端

2018-05-02 15:41:27

JavaScript人脸检测图像识别

2018-03-06 09:54:48

数据库备份恢复

2021-01-26 05:11:28

if-else代码虚函数

2018-07-30 14:24:16

机器学习神经网络函数
点赞
收藏

51CTO技术栈公众号