Bean Validation设置校验失败全局返回信息(续自定义JSR validation)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z28126308/article/details/77774857

demo网址在上一篇有,这篇写如何定义validation验证失败后的返回信息。

(截图源于上篇)

由下图看出验证失败后Swagger会抛出一堆错误信息,但其实前端要的只是错误的字段信息,即一般我们只需返回错误字段的信息,下面为上红框异常类的源码:

public class MethodArgumentNotValidException extends Exception {
    private final MethodParameter parameter;
    private final BindingResult bindingResult;

    public MethodArgumentNotValidException(MethodParameter parameter, BindingResult bindingResult) {
        this.parameter = parameter;
        this.bindingResult = bindingResult;
    }

    public MethodParameter getParameter() {
        return this.parameter;
    }

    public BindingResult getBindingResult() {
        return this.bindingResult;
    }

    public String getMessage() {
        StringBuilder sb = (new StringBuilder("Validation failed for argument at index ")).append(this.parameter.getParameterIndex()).append(" in method: ").append(this.parameter.getMethod().toGenericString()).append(", with ").append(this.bindingResult.getErrorCount()).append(" error(s): ");
        Iterator var2 = this.bindingResult.getAllErrors().iterator();

        while(var2.hasNext()) {
            ObjectError error = (ObjectError)var2.next();
            sb.append("[").append(error).append("] ");
        }

        return sb.toString();
    }
}
从源码可以看出验证失败Swagger输出的信息都是该异常类组装的字符串,若要自定义返回信息,那我们只需从这个异常类获取相应的信息根据需要组装返回即可。由于验证失败会抛出异常,所以我们可以通过设置全局异常同一处理,具体处理类如下:

@ControllerAdvice
@ResponseBody//必须添加,否则Spring会将返回值当作视图解析抛出异常
public class ParamExceptionHandler {
    @Autowired
    private HttpServletRequest request;

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Object MethodArgumentNotValidHandler(MethodArgumentNotValidException exception){
        //按需重新封装需要返回的错误信息
        List<ParamValidationResult> paramValidationResults = new ArrayList<>();
        //解析原错误信息,封装后返回,此处返回非法的字段名称,错误信息
        for (FieldError error : exception.getBindingResult().getFieldErrors()) {
            ParamValidationResult validationResult = new ParamValidationResult();
            validationResult.setMessage(error.getDefaultMessage());
            validationResult.setParam(error.getField());
            paramValidationResults.add(validationResult);
        }
        return new ResultMsg(ResultCode.CODE_401, paramValidationResults);
    }
}
个人自定义返回码:

public enum ResultCode {
    CODE_200(200, "访问成功"),
    CODE_401(401, "非法请求,参数错误"),
    CODE_402(402, "未授权,accessToken过期或无效"),
    CODE_403(403, "Method使用错误,请查看API"),
    CODE_404(404, "找不到访问地址"),
    CODE_406(406, "没有权限访问"),
    CODE_500(500, "系统内部错误"),
    CODE_501(501, "对象已存在,请检测唯一性"),
    CODE_502(502, "当前版本与服务器版本不一致,请更新应用"),
    CODE_503(503, "对象不存在,请检测请求参数"),
    CODE_504(504, "服务器连接错误,请稍后重试"),
    CODE_505(505, "key校验失败"),
    CODE_506(506, "RPC服务连接失败,请稍后重试");

    public Integer code;
    public String msg;

    ResultCode(Integer code, String msg) {
        this.msg = msg;
        this.code = code;
    }
}
返回信息类:

public class ResultMsg {
    private Integer code;
    private String msg;
    private Object data;

    public ResultMsg() {
    }

    public ResultMsg(ResultCode resultCode) {
        this.code = resultCode.code;
        this.msg = resultCode.msg;
    }

     public ResultMsg(ResultCode resultCode,Object data) {
         this.code = resultCode.code;
         this.msg = resultCode.msg;
         this.data = data;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

再次运行测试Swagger已能输出理想的错误信息

扫描二维码关注公众号,回复: 4119782 查看本文章



猜你喜欢

转载自blog.csdn.net/z28126308/article/details/77774857
今日推荐