@valid 通过注解实现接口入参检查
- 前言
- 一、引入依赖
- 二、使用步骤
- 1.创建入参对象 request
- 2.提供一个接口 controller
- 3.全局异常捕获 GlobalExceptionHandler
- 4.执行结果
- 总结
前言
作为一个后端开发,一般是不单独对接口参数的每个入参进行长度、最大值、最小值判断。
但是~~总会遇到要检查的时候,比如说:测试给我提了几个参数长度校验
bug1:年龄输入 99999 没有合理性检查
bug2:姓名输入 啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧啧 没做长度校验~
遇到这种吧,前端又不改,只有后端来检查下咯。
一、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
二、使用步骤
1.创建入参对象 request
代码如下(示例):
import lombok.Data;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* @author long_tao
*/
@Data
public class ValidOneRequest {
@NotNull(message = "唯一键不能为空")
private String uuid;
@Size(max = 20, message = "name最大长度为20")
private String name;
@NotNull(message = "状态不能为空")
private Boolean status;
@Max(value = 200, message = "年龄不能大于200")
private Integer age;
}
2.提供一个接口 controller
代码如下(示例):
import com.example.demo.request.ValidOneRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* @author lobster
*/
@RestController
@RequestMapping("valid")
public class ValidController {
@PostMapping(value = "demo", name = "使用注解,实现入参字段长度校验、非空校验")
public String validDemo(@Valid @RequestBody ValidOneRequest validOneRequest) {
return "success!";
}
}
3.全局异常捕获 GlobalExceptionHandler
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
/**
* @author lobster
* GlobalExceptionHandler中做了异常处理 所以一般情况下不需要再去手动捕获异常
**/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 请求接口,入参校验
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public String handleException400(HttpServletRequest req, MethodArgumentNotValidException e) {
e.printStackTrace();
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder();
for (FieldError fieldError : bindingResult.getFieldErrors()) {
sb.append(fieldError.getDefaultMessage()).append(",");
}
String errorMessage = sb.toString();
return errorMessage.substring(0, errorMessage.length() - 1);
}
4.执行结果
总结
综上所述:可以针对接口的参数进行检查,并返回指定错误信息
我返回的是字符串,一般项目上返回的是对象,如:{“code”:500,“msg”:“XX字段超限\nXX字段超过最大值\n”}
希望每一个开发人员,都能干到退休,撒花~