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

来源:互联网 发布:域名的拼音 编辑:程序博客网 时间:2024/05/16 07:59

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已能输出理想的错误信息



阅读全文
0 0
原创粉丝点击