1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.拦截验证异常并返回统一JSON格式
因框架抛出的异常可读性较差,不能直接返回给前端需要异常拦截封装返回。
返回给前端的实体类
package com.test;
import java.io.Serializable;
import lombok.Data;
@Data
public class CommonResult<T> implements Serializable {
private static final long serialVersionUID = -8676181355403088497L;
private Integer code;
private String message;
private T data;
public CommonResult() {
}
public CommonResult(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
}
异常拦截
拦截异常,封装成可读性较好的返回参数。
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public CommonResult exceptionHandler(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
Map<String, String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach(item -> {
errorMap.put(item.getField(), item.getDefaultMessage());
});
return new CommonResult(400, "参数错误或数据异常",errorMap);
}
}
3.实际使用
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
public class CompanyAttributeSaveDto {
@NotNull(message = "直营门店数不能为空")
private Integer directQuantity;
@NotNull(message = "连锁门店数不能为空")
private Integer chainQuantity;
}
使用@Valid
注解,接收到请求时,框架会在执行controller方法代码之前先执行参数校验
@PostMapping("save")
public CommonResult<Boolean> addCompanyAttribute(@Valid @RequestBody CompanyAttributeSaveDto saveDto){
// 保存
return new CommonResult(200, "成功",null);
}
响应结果
{
"code": 400,
"message": "参数错误或数据异常",
"data": {
"directQuantity": "直营门店数不能为空",
"chainQuantity": "连锁门店数不能为空"
}
}