Bean Validation设置校验失败全局返回信息(续自定义JSR validation)
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已能输出理想的错误信息