在使用springboot validation对参数进行校验时,对于参数校验不通过的情况会抛出异常——MethodArgumentNotValidException(继承自BindException)、ConstraintViolationException,如果全局异常处理器没有对这些异常都进行处理的话会导致响应格式不统一
/**
* 全局异常处理器
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<String> handleValidationExceptions(MethodArgumentNotValidException ex) {
return Result.error(ex.getBindingResult().getAllErrors().get(0).getDefaultMessage());
}
@ExceptionHandler(BindException.class)
public Result<String> handleValidationExceptions(BindException ex) {
return Result.error(ex.getBindingResult().getAllErrors().get(0).getDefaultMessage());
}
@ExceptionHandler(ConstraintViolationException.class)
public Result<String> handleValidationExceptions(ConstraintViolationException ex) {
return Result.error(ex.getConstraintViolations().iterator().next().getMessage());
}
}
@ApiModel("统一返回对象")
public class Result<T> implements Serializable {
//解释各字段的意思
@ApiModelProperty(value = "返回码", dataType = "String", position = 1)
private int code;
@ApiModelProperty(value = "提示信息", dataType = "String", position = 2)
private String msg;
@ApiModelProperty(value = "返回值", dataType = "object", position = 3)
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
//几种构造方法
public Result() {
}
public Result(Type type, String msg) {
this.code = type.value;
this.msg = msg;
}
public Result(Type type, String msg, T data) {
this.code = type.value;
this.msg = msg;
if (data != null) {
this.data = data;
}
}
//静态方法要使用泛型参数的话,要声明其为泛型方法
public static <T> Result<T> success() {
return success("操作成功");
}
public static <T> Result<T> success(T data) {
return success("操作成功", data);
}
public static <T> Result<T> success(String msg) {
return success(msg, (T) null);
}
public static <T> Result<T> success(String msg, T data) {
return new Result<T>(Type.SUCCESS, msg, data);
}
public static <T> Result<T> warn(String msg) {
return warn(msg, (T) null);
}
public static <T> Result<T> warn(String msg, T data) {
return new Result<T>(Type.WARN, msg, data);
}
public static <T> Result<T> unAuth() {
return new Result<T>(Type.UNAUTH, "未登陆", (T)null);
}
public static <T> Result<T> error() {
return error("操作失败");
}
public static <T> Result<T> error(String msg) {
return error(msg, (T)null);
}
public static <T> Result<T> error(String msg, T data) {
return new Result<T>(Type.ERROR, msg, data);
}
public static <T> Result<T> error(T data) {
return new Result<T>(Type.ERROR, "", data);
}
public static enum Type {
SUCCESS(200),
WARN(402),
UNAUTH(401),
ERROR(500);
private final int value;
private Type(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
}
参考链接: