springboot参数验证(@Valid)全局异常统一处理并返回
硅谷探秘者
2020-07-28发表
0
0
2636
参数校验失败统一返回给前端异常信息
参数校验如何使用参考:http://www.jiajiajia.club/blog/artical/yjw520/248
校验需要的pom依赖
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
常用校验注解
- @Null 限制只能为null
- @NotNull 限制必须不为null
- @AssertFalse 限制必须为false
- @AssertTrue 限制必须为true
- @DecimalMax(value) 限制必须为一个不大于指定值的数字
- @DecimalMin(value) 限制必须为一个不小于指定值的数字
- @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
- @Future 限制必须是一个将来的日期
- @Max(value) 限制必须为一个不大于指定值的数字
- @Min(value) 限制必须为一个不小于指定值的数字
- @Past 限制必须是一个过去的日期
- @Pattern(value) 限制必须符合指定的正则表达式
- @Size(max,min) 限制字符长度必须在min到max之间
- @Past 验证注解的元素值(日期类型)比当前时间早
- @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
- @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
- @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
全局统一异常处理配置类
import com.alibaba.fastjson.JSON;
import com.elasticsearch.entity.Result;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* 全局统一异常处理
*/
@Order(-1000)
@Component
public class ParamValidExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse response, Object o, Exception e) {
StringBuilder sb = new StringBuilder();
//处理异常
if(e instanceof MyException) {
//自定义异常
resolverBussinessException(e, sb);
} else if (e instanceof BindException) {
//参数校验异常
resolverBindException(e, sb);
} else {
//其他异常
resolverOtherException(e, sb);
}
/**
* 返回前端json字符串
*/
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
try {
// Result 是你返回给前端的数据类型,自己定义
response.getWriter().write(JSON.toJSONString(Result.err(sb.toString())));
} catch (IOException ex) {
e.printStackTrace();
}
return new ModelAndView();
}
/*
* 处理业务层异常
*/
private void resolverBussinessException(Exception ex, StringBuilder sb) {
MyException myException = (MyException) ex;
sb.append(myException.getMessage());
}
/*
* 处理参数校验
*/
private void resolverBindException(Exception ex, StringBuilder sb) {
BindException be = (BindException) ex;
List<FieldError> errorList = be.getBindingResult().getFieldErrors();
for (FieldError error : errorList) {
sb.append(error.getObjectName());
sb.append("对象的");
sb.append(error.getField());
sb.append("字段");
sb.append(error.getDefaultMessage());
}
}
/*
* 处理其他异常
*/
private void resolverOtherException(Exception ex, StringBuilder sb) {
sb.append(ex.getMessage());
}
}