springMVC @valid 無(wú)效 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對(duì)象轉(zhuǎn)換為CallResult輸出,驗(yàn)證錯(cuò)誤轉(zhuǎn)為map
     * 
     * @param error 錯(cuò)誤對(duì)象
     * @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<String,String> errMap = new HashMap<String,String>();
            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<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    private int status = 200; // 狀態(tài)碼
    private String message; // 結(jié)果描述
    private T data; // 返回?cái)?shù)據(jù)

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

    /**
     * 構(gòu)造函數(shù),使用默認(rèn)結(jié)果枚舉ResultEnum設(shè)置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);
    }

    /**
     * 構(gòu)造函數(shù)
     * 
     * @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;
    }

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

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

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

    /**
     * 默認(rèn)的執(zhí)行結(jié)果枚舉. <br>
     * 200=執(zhí)行成功 <br>
     * 400=提交的數(shù)據(jù)錯(cuò)誤倒信,即參數(shù)錯(cuò)誤 <br>
     * 401=身份驗(yàn)證失敗,如登錄失敗等 <br>
     * 403=無(wú)權(quán)限訪問 <br>
     * 500=執(zhí)行錯(cuò)誤,通常是程序執(zhí)行拋出異常了
     */
    public enum ResultEnum {
        SUCCESS(200),
        PARAM_ERROR(400),
        NO_AUTH(401),
        FORBIDDEN(403),
        SERVER_ERROR(500);

        private int status;
        private final static String[] initMsgs = { "執(zhí)行成功","提交的數(shù)據(jù)錯(cuò)誤","身份驗(yàn)證失敗","無(wú)權(quán)限訪問","執(zhí)行錯(cuò)誤" };

        private ResultEnum(int status) {
            this.status = status;
        }

        public int getStatus() {
            return status;
        }

        /**
         * 返回結(jié)果描述.
         * 
         * @return 結(jié)果描述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()));
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卫玖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胞皱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遵班,死亡現(xiàn)場(chǎng)離奇詭異忧换,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蜻牢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門烤咧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人抢呆,你說(shuō)我怎么就攤上這事煮嫌。” “怎么了抱虐?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵立膛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我梯码,道長(zhǎng)宝泵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任轩娶,我火速辦了婚禮儿奶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳄抒。我一直安慰自己闯捎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布许溅。 她就那樣靜靜地躺著瓤鼻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贤重。 梳的紋絲不亂的頭發(fā)上茬祷,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音并蝗,去河邊找鬼祭犯。 笑死秸妥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沃粗。 我是一名探鬼主播粥惧,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼最盅!你這毒婦竟也來(lái)了突雪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涡贱,失蹤者是張志新(化名)和其女友劉穎挂签,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盼产,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饵婆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戏售。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侨核。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灌灾,靈堂內(nèi)的尸體忽然破棺而出搓译,到底是詐尸還是另有隱情,我是刑警寧澤锋喜,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布些己,位于F島的核電站,受9級(jí)特大地震影響嘿般,放射性物質(zhì)發(fā)生泄漏段标。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一炉奴、第九天 我趴在偏房一處隱蔽的房頂上張望逼庞。 院中可真熱鬧,春花似錦瞻赶、人聲如沸赛糟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)璧南。三九已至,卻和暖如春师逸,著一層夾襖步出監(jiān)牢的瞬間司倚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留对湃,地道東北人崖叫。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓遗淳,卻偏偏與公主長(zhǎng)得像拍柒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屈暗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容