您好,登錄后才能下訂單哦!
在開發rest接口時,我們往往會定義統一的返回格式,列如:
{ ??"status":?true, ??"code":?200, ??"message":?null, ??"data":?[ ????{ ??????"id":?"101", ??????"name":?"jack" ????}, ????{ ??????"id":?"102", ??????"name":?"jason" ????} ??] }
但是如果調用方請求我們的api時把接口地址寫錯了,就會得到一個404錯誤,在傳統的web系統中我們可自定義404錯誤頁面,展示更友好。
在spring boot中其實也是返回了一個json格式的數據,如下:
{ ??"timestamp":?1492063521109, ??"status":?404, ??"error":?"Not?Found", ??"message":?"No?message?available", ??"path":?"/rest11/auth" }
告訴我們哪個地址是沒找到,其實也挺友好的,但是因為我們上面自定義的數據格式跟下面的不一致,當用戶拿到這個返回的時候是無法識別的,其中最明顯的是status字段。
我們自定義的是boolean類型,表示是否成功
這邊返回的就是http的狀態碼
所以我們需要在發生這種系統錯誤時也能返回我們自定義的那種格式
定義一個異常處理類
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; 官網?:www.1b23.com ? @ControllerAdvice public?class?GlobalExceptionHandler?{ ????private?Logger?logger?=?LoggerFactory.getLogger(GlobalExceptionHandler.class); ? ????/** ?????*?系統異常處理,比如: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是我們返回格式的實體類
這種在發生錯誤時這邊會捕獲到,然后封裝好返回格式,返回給調用方
最后關鍵的一步是在spring boot的配置文件中加上如下配置:
#出現錯誤時,?直接拋出異常 spring.mvc.throw-exception-if-no-handler-found=true #不要為我們工程中的資源文件建立映射 spring.resources.add-mappings=false
然后我們調用一個不存在的接口時,返回的錯誤信息就是我們自定義的那種格式了
{ ??"status":?false, ??"code":?404, ??"message":?"No?handler?found?for?GET?/rest11/auth", ??"data":?null }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。