spring boot 異常統(tǒng)一處理

今天完成的事情

異常統(tǒng)一處理

異常在web開發(fā)中我們是再熟悉不過了迈嘹,沒學(xué)習(xí)spring boot之前出現(xiàn)異常沒有用一個統(tǒng)一的處理方法摇锋,并且沒有根據(jù)不同的異常來給出不同的提示驾霜,在spring boot 這里如果出現(xiàn)異常會出現(xiàn)下面這個頁面:

spring boot 默認(rèn)錯誤頁面

這個頁面對用戶不是很友好耕餐,因?yàn)殄e誤是什么引起的,用戶不知道旺上。所以需要一個針對不同的異常給出不同的提示信息瓶蚂。下面以一個小demo來演示如何統(tǒng)一處理不同的異常。

1.創(chuàng)建全局異常處理類

  • @ControllerAdvice定義統(tǒng)一的異常處理類
  • @ExceptionHandler定義針對不同異常的處理方法
  • 最后將異常對象和出異常的url映射到erroe.html的錯誤頁面中
package com.baidu.ch8mybatis.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/**
 * @author huangdongjiang
 * @date 2018/8/29 22:52
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    private static final String DEFAULT_ERROR_VIEM = "error";

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) {
        System.out.println("進(jìn)入異常中心宣吱。窃这。。............................");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("exception", e);
        modelAndView.addObject("url", request.getRequestURL());
        modelAndView.setViewName(DEFAULT_ERROR_VIEM);
        return modelAndView;
    }
}

2.寫一個顯示異常的錯誤頁面:
error.html

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head lang="en">
    <meta charset="UTF-8" />
    <title>統(tǒng)一異常處理</title>
</head>
<body>
<h1>Error Handler</h1>
<div th:text="${url}"></div>
<div th:text="${exception.message}"></div>
</body>
</html>

3.寫一個Controller來測試一下

package com.baidu.ch8mybatis.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author huangdongjiang
 * @date 2018/8/30 0:08
 */
@Controller
public class Hello {
    @RequestMapping("/hello")
    public String hello() throws Exception {
        System.out.println("拋出異常.......................................");
        throw new Exception("訪問的頁面忙");
    }
}

直接訪問:http://localhost:8080/hello可以看到效果:(markdown截圖比較麻煩凌节,我就不截自己的錯誤頁面圖了钦听,下面這張圖是在博客的教程直接拿過來的)

image

另外,如果我們做的是RESTful的接口倍奢,那就不能直接返回html頁面,而是返回json格式的數(shù)據(jù)垒棋,那這時應(yīng)該怎么統(tǒng)一處理異常呢卒煞?做法如下:

1.把返回給頁面的信息封裝成一個ErrorInfo對象

package com.baidu.ch8mybatis.exception;

/**
 * @author huangdongjiang
 * @date 2018/8/30 0:40
 */
public class ErrorInfo<T> {
    public static final Integer OK = 0;
    public static final Integer ERROR = 100;

    private Integer code;
    private String message;
    private String url;
    private T data;
    //省略了getter和setter方法
}

2.根據(jù)不同的錯誤自定義異常

package com.baidu.ch8mybatis.exception;

/**
 * @author huangdongjiang
 * @date 2018/8/30 0:43
 */
public class MyException extends Exception {

    public MyException(String message) {
        super(message);
    }
}

3.在統(tǒng)一異常處理類里面加上我們處理自定義異常的方法,這里跟非RESTful接口不同的地方是在方法上面加上@ResponseBody注解叼架,讓其返回json格式的數(shù)據(jù)

@ExceptionHandler(value = MyException.class)
@ResponseBody
public ErrorInfo<String> jsonErrorHandler(HttpServletRequest request, MyException e) {
        //把錯誤給封裝起來畔裕,返回錯誤對象的json格式數(shù)據(jù)
        ErrorInfo<String> r = new ErrorInfo<>();
        r.setCode(ErrorInfo.ERROR);
        r.setMessage(e.getMessage());
        r.setUrl(request.getRequestURL().toString());
        r.setData("Some Data");
        return r;
}

4.測試

package com.baidu.ch8mybatis.controller;

import com.baidu.ch8mybatis.exception.MyException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author huangdongjiang
 * @date 2018/8/30 0:45
 */
@Controller
public class HelloController {

    @RequestMapping("/json")
    public String json() throws MyException {
        throw new MyException("不好衣撬,出錯啦...");
    }
}

經(jīng)過測試返回的確是json格式的數(shù)據(jù)

明天計(jì)劃的事情

1.學(xué)下權(quán)限認(rèn)證

遇到的問題

暫無

收獲

如上

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扮饶,隨后出現(xiàn)的幾起案子具练,更是在濱河造成了極大的恐慌,老刑警劉巖甜无,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扛点,死亡現(xiàn)場離奇詭異岂丘,居然都是意外死亡陵究,警方通過查閱死者的電腦和手機(jī)奥帘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寨蹋,“玉大人,你說我怎么就攤上這事已旧‰咕希” “怎么了评姨?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吐句。 經(jīng)常有香客問我,道長嗦枢,這世上最難降的妖魔是什么攀芯? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任文虏,我火速辦了婚禮侣诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氧秘。我一直安慰自己年鸳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布丸相。 她就那樣靜靜地躺著搔确,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膳算,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天座硕,我揣著相機(jī)與錄音,去河邊找鬼涕蜂。 笑死华匾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的机隙。 我是一名探鬼主播蜘拉,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼黍瞧!你這毒婦竟也來了诸尽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤印颤,失蹤者是張志新(化名)和其女友劉穎您机,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體年局,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡际看,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢否。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仲闽。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖僵朗,靈堂內(nèi)的尸體忽然破棺而出赖欣,到底是詐尸還是另有隱情,我是刑警寧澤验庙,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布顶吮,位于F島的核電站,受9級特大地震影響粪薛,放射性物質(zhì)發(fā)生泄漏悴了。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一违寿、第九天 我趴在偏房一處隱蔽的房頂上張望湃交。 院中可真熱鬧,春花似錦藤巢、人聲如沸搞莺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腮敌。三九已至阱当,卻和暖如春糜工,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捌木。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工嫉戚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彬檀。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像窍帝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子疯坤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,827評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理压怠,服務(wù)發(fā)現(xiàn)飞苇,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 前言 今天來一起學(xué)習(xí)一下Spring Boot中的異常處理布卡,在日常web開發(fā)中發(fā)生了異常,往往是需要通過一個統(tǒng)一的...
    嘟爺MD閱讀 25,837評論 8 79
  • 久違了宫患,好久沒有發(fā)表文字 我最近在減肥这弧,認(rèn)識了我的健康顧問羽非娃闲,一位很知性很溫婉的大姐匾浪。羽非姐之前是海洋大學(xué)的心理...
    愛畫畫的鄭先生閱讀 202評論 0 0
  • 文/秋葉暖 我一直感覺自己是一個很幸運(yùn)的人,不管是在什么時候渐白,似乎好像總能化險(xiǎn)為夷尊浓,就算遇見什么危險(xiǎn)栋齿,總能和危險(xiǎn)擦...
    錦鈺女子閱讀 211評論 0 2