一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

知識(shí)點(diǎn)-Spring Boot 統(tǒng)一異常處理匯總

 太極混元天尊 2018-05-24

在實(shí)際開發(fā)中,我們會(huì)遇到很多異常,在發(fā)生異常的時(shí)候Spring Boot默認(rèn)提供了錯(cuò)誤頁面展示給用戶。看似比較友好,其實(shí)頁面很丑。

上面講的是做頁面開發(fā)的時(shí)候遇到的問題,還有一種情況就是用來開發(fā)Rest接口,當(dāng)錯(cuò)誤的時(shí)候我們希望返回給用戶的是我們接口的標(biāo)準(zhǔn)格式,不是返回一段html代碼。

接下來分別給大家介紹下解決方案:

頁面處理

首先我們來看頁面錯(cuò)誤的處理情況,當(dāng)我們的程序內(nèi)部報(bào)錯(cuò)的時(shí)候或者訪問的頁面找不到的時(shí)候,我們可以看到下面的錯(cuò)誤頁面:

1.png

我們可以自己設(shè)計(jì)好看一點(diǎn)的頁面來替換這個(gè)頁面,這樣會(huì)更友好點(diǎn),比如我們看今日頭條的頁面:

2.png

以前用Spring MVC時(shí)都是直接配置web.xml

error-page>
   error-code>404error-code>
   location>/WEB-INF/view/404.jsplocation>
error-page>
error-page>
   error-code>400error-code>
   location>/WEB-INF/view/400.jsplocation>
error-page>
error-page>
   error-code>500error-code>
   location>/WEB-INF/view/500.jsplocation>
error-page>

在Spring Boot中也非常簡(jiǎn)單,直接編寫對(duì)應(yīng)的錯(cuò)誤頁面,進(jìn)行覆蓋即可:

/**
* 自定義錯(cuò)誤頁面覆蓋spring boot中的錯(cuò)誤頁面
* @author yinjihuan
*
*/

@Controller
public class ErrorController {
   @GetMapping('/400')
   public String badRequest() {
       return 'error/400';
   }
   @GetMapping('/404')
   public String notFound() {
       return 'error/404';
   }
   @GetMapping('/500')
   public String serverError() {
       return 'error/500';
   }
}

頁面內(nèi)容可以自己寫:

body>
   section id='error' class='container text-center' style='height:800px;'>
       h1>404, 頁面沒有找到h1>
       p>您正在尋找的頁面不存在或發(fā)生其他錯(cuò)誤。p>
       a class='btn btn-primary' href='http://pan.'>回到網(wǎng)站首頁a>
   section>
body>

REST接口處理

在開發(fā)rest接口時(shí),我們往往會(huì)定義統(tǒng)一的返回格式,列如:

{
 'status': true,
 'code': 200,
 'message': null,
 'data': [
   {
     'id': '101',
     'name': 'jack'
   },
   {
     'id': '102',
     'name': 'jason'
   }
 ]
}


但是如果調(diào)用方請(qǐng)求我們的api時(shí)把接口地址寫錯(cuò)了,就會(huì)得到一個(gè)404錯(cuò)誤頁面,最友好的方式就是返回固定的JSON格式,里面有個(gè)code為404。

所以我們需要在發(fā)生這種系統(tǒng)錯(cuò)誤時(shí)也能返回我們自定義的那種格式

定義一個(gè)異常處理類

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
public class GlobalExceptionHandler {
   private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
   /**
    * 系統(tǒng)異常處理,比如:404,500
    * @param req
    * @param resp
    * @param e
    * @return
    * @throws Exception
    */

   @ExceptionHandler(value = Exception.class)
   @ResponseBody
   public ResponseData defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
       logger.error('', e);
       ResponseData r = new ResponseData();
       r.setMessage(e.getMessage());
       if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
            r.setCode(404);
       } else {
            r.setCode(500);
       }
       r.setData(null);
       r.setStatus(false);
       return r;
   }
}

ResponseData是我們返回格式的實(shí)體類

public class ResponseData {
   private Boolean status = true;
   private int code = 200;
   private String message;
   private Object data;
}

這種在發(fā)生錯(cuò)誤時(shí)這邊會(huì)捕獲到,然后封裝好返回格式,返回給調(diào)用方

最后關(guān)鍵的一步是在spring boot的配置文件中加上如下配置:

#出現(xiàn)錯(cuò)誤時(shí), 直接拋出異常
spring.mvc.throw-exception-if-no-handler-found=true
#不要為我們工程中的資源文件建立映射
spring.resources.add-mappings=false

然后我們調(diào)用一個(gè)不存在的接口時(shí),返回的錯(cuò)誤信息就是我們自定義的那種格式了

{
 'status': false,
 'code': 404,
 'message': 'No handler found for GET /rest11/auth',
 'data': null
}

頁面錯(cuò)誤和REST錯(cuò)誤共存

當(dāng)我們加好rest接口處理的方式后,訪問頁面不存在就會(huì)返回一段json數(shù)據(jù),如果你的項(xiàng)目中既有rest接口,又有頁面,這個(gè)時(shí)候就有沖突了。

我們可以通過為rest接口增加統(tǒng)一的訪問前綴,比如:/rest/xxxx來區(qū)分請(qǐng)求,然后用@ControllerAdvice來分別處理:

import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler {
   private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
   /**
    * 系統(tǒng)異常處理,比如:404,500
    *
    * @param req
    * @param resp
    * @param e
    * @return
    * @throws Exception
    */

   @ExceptionHandler(value = Exception.class)
   // @ResponseBody
   public Object defaultErrorHandler(HttpServletRequest req, HttpServletResponse response, Exception e)
           throws Exception {
       logger.error('', e);
       if (req.getRequestURI().startsWith('/rest')) {
           ResponseData r = new ResponseData();
           r.setMessage(e.getMessage());
           if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
               r.setCode(404);
           } else {
               r.setCode(500);
           }
           r.setData(null);
           r.setStatus(false);
           PrintWriter writer = response.getWriter();
           writer.println(JsonUtils.toJson(r));
           writer.flush();
           writer.close();
           return null;
       } else {
           if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
               return 'error/404';
           } else {
               return 'error/500';
           }
       }
   }
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    色婷婷视频国产一区视频| 不卡视频免费一区二区三区| 亚洲一区二区三区国产| 亚洲黑人精品一区二区欧美| 国产一区二区三区av在线| 99国产精品国产精品九九| 国产永久免费高清在线精品| 亚洲欧洲成人精品香蕉网| 国产成人免费高潮激情电| 国产亚洲精品一二三区| 不卡一区二区在线视频| 国产熟女一区二区三区四区| 最近的中文字幕一区二区| 男女一进一出午夜视频| 日本午夜乱色视频在线观看| 国产三级黄片在线免费看| 国产一区二区三区精品免费| 国产精品午夜小视频观看| 美女被后入福利在线观看| 日韩中文高清在线专区| 女人高潮被爽到呻吟在线观看| 欧美精品亚洲精品日韩精品| 好吊一区二区三区在线看| 欧美日韩中黄片免费看| 亚洲欧洲在线一区二区三区| 91日韩欧美国产视频| 九九九热视频最新在线| 少妇人妻一级片一区二区三区| 91欧美亚洲精品在线观看| 欧美性欧美一区二区三区| 黄男女激情一区二区三区| 午夜成年人黄片免费观看| 亚洲黄色在线观看免费高清| 欧美丝袜诱惑一区二区| 亚洲精品福利视频在线观看| 亚洲国产精品久久网午夜| 可以在线看的欧美黄片| 国产在线一区二区三区不卡| 丰满少妇被猛烈撞击在线视频| 亚洲午夜福利不卡片在线| 国语对白刺激高潮在线视频|