springMVC @valid 无效 MethodArgumentNotValidException MethodArgumentNotValidException或BindException

在BaseController中写

 @ExceptionHandler(value = { MethodArgumentNotValidException.class,BindException.class })
    @ResponseStatus(code = HttpStatus.BAD_REQUEST)
    public @ResponseBody CallResult validExceptionHandler(Exception validException) {
        CallResult result = new CallResult<>();
        if (validException instanceof MethodArgumentNotValidException) {
            convertError(((MethodArgumentNotValidException) validException).getBindingResult(), result);
        } else if (validException instanceof BindException) {
            convertError(((BindException) validException).getBindingResult(), result);
        }

        return result;
    }

    /**
     * 将errors对象转换为CallResult输出,验证错误转为map
     * 
     * @param error 错误对象
     * @param result
     * @see org.springframework.validation.Errors
     * @return
     */
    @SuppressWarnings({ "rawtypes","unchecked" })
    public static void convertError(Errors error, CallResult result) {
        if (error.hasErrors()) {
            result.setStatus(ResultEnum.PARAM_ERROR.getStatus());
            Map errMap = new HashMap();
            String errorMsg = "";
            if (error.hasGlobalErrors()) {
                String globalMsg = "";
                for (ObjectError ferr : error.getGlobalErrors()) {
                    globalMsg = globalMsg + ferr.getDefaultMessage() + ";";
                }
                errorMsg += globalMsg;
                errMap.put("_global_msg", globalMsg);
            }
            if (error.hasFieldErrors()) {
                for (FieldError ferr : error.getFieldErrors()) {
                    errMap.put(ferr.getField(), ferr.getDefaultMessage());
                    errorMsg = errorMsg + ferr.getDefaultMessage() + ";";
                }
            }
            result.setMessage(errorMsg);
            result.setData(errMap);
        }
    }

CallResult

public class CallResult implements Serializable {

    private static final long serialVersionUID = 1L;

    private int status = 200; // 状态码
    private String message; // 结果描述
    private T data; // 返回数据

    public CallResult() {
        this(ResultEnum.SUCCESS);
    }

    /**
     * 构造函数,使用默认结果枚举ResultEnum设置status和message
     * 
     * @param result ResultEnum
     */
    public CallResult(ResultEnum result) {
        setResult(result.getStatus(), result.getMessage());
    }

    public CallResult(int status) {
        this.status = status;
    }

    public CallResult(int status, String message) {
        setResult(status, message);
    }

    /**
     * 构造函数
     * 
     * @param status
     * @param message
     * @param data
     */
    public CallResult(int status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int code) {
        this.status = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

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

    public void setResult(ResultEnum err) {
        this.status = err.getStatus();
        this.message = err.getMessage();
    }

    public void setResult(int code, String msg) {
        this.status = code;
        this.message = msg;
    }

    /**
     * 结果是否成功,即等于ErrorEnum.SUCCESS.
     * 
     * @return boolean
     */
    public boolean success() {
        return status == ResultEnum.SUCCESS.getStatus();
    }

    public static  CallResult error(String message) {
        CallResult result = new CallResult<>(ResultEnum.SERVER_ERROR.getStatus(), message);
        return result;
    }

    public static  CallResult paramError(String message) {
        CallResult result = new CallResult<>(ResultEnum.PARAM_ERROR.getStatus(), message);
        return result;
    }

    /**
     * 默认的执行结果枚举. 
* 200=执行成功
* 400=提交的数据错误,即参数错误
* 401=身份验证失败,如登录失败等
* 403=无权限访问
* 500=执行错误,通常是程序执行抛出异常了 */ public enum ResultEnum { SUCCESS(200), PARAM_ERROR(400), NO_AUTH(401), FORBIDDEN(403), SERVER_ERROR(500); private int status; private final static String[] initMsgs = { "执行成功","提交的数据错误","身份验证失败","无权限访问","执行错误" }; private ResultEnum(int status) { this.status = status; } public int getStatus() { return status; } /** * 返回结果描述. * * @return 结果描述String */ public String getMessage() { switch (status) { case 200: return initMsgs[0]; case 400: return initMsgs[1]; case 401: return initMsgs[2]; case 403: return initMsgs[3]; case 500: return initMsgs[4]; default: break; } return null; } } @Override public String toString() { return MessageFormat.format("status={0},message={1},data={2}", status, message, (data == null ? "" : data.toString())); } }

你可能感兴趣的:(springMVC @valid 无效 MethodArgumentNotValidException MethodArgumentNotValidException或BindException)