Springboot2.0自適應(yīng)效果錯(cuò)誤響應(yīng)過(guò)程解析
這篇文章主要介紹了Springboot2.0自適應(yīng)效果錯(cuò)誤響應(yīng)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
實(shí)現(xiàn)效果當(dāng)訪問(wèn)thymeleaf渲染頁(yè)面時(shí),顯示的是自定義的錯(cuò)誤頁(yè)面
當(dāng)以接口方式訪問(wèn)時(shí),顯示的是自定義的json數(shù)據(jù)響應(yīng)
1. 編寫(xiě)自定義異常
package cn.jfjb.crud.exception; /** * @author john * @date 2019/11/24 - 9:48 */ public class UserNotExistException extends RuntimeException { public UserNotExistException() { super("用戶不存在"); } }
2. 自定義異常處理&返回定制json數(shù)據(jù),轉(zhuǎn)發(fā)到/error進(jìn)行自適應(yīng)響應(yīng)效果處理
package cn.jfjb.crud.handler; import cn.jfjb.crud.exception.UserNotExistException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; /** * @author john * @date 2019/11/24 - 10:43 */ @ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(UserNotExistException.class) public String handleException(Exception e, HttpServletRequest request) { Map<String, Object> map = new HashMap<>(); //傳入我們自己的錯(cuò)誤狀態(tài)碼 4xx 5xx,否則就不會(huì)進(jìn)入定制錯(cuò)誤頁(yè)面的解析流程 /** * Integer statusCode = (Integer) request .getAttribute("javax.servlet.error.status_code"); */ request.setAttribute("javax.servlet.error.status_code", 400); map.put("code", "user.notexist"); map.put("message", e.getMessage()); //轉(zhuǎn)發(fā)給錯(cuò)誤處理器MyErrorAttributes request.setAttribute("ext", map); //轉(zhuǎn)發(fā)到/error進(jìn)行自適應(yīng)響應(yīng)效果處理 return "forward:/error"; } }
3. 定制數(shù)據(jù)攜帶出去
出現(xiàn)錯(cuò)誤以后,會(huì)來(lái)到/error請(qǐng)求,會(huì)被BasicErrorController處理,響應(yīng)出去可以獲取的數(shù)據(jù)是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)規(guī)定的方法);
1、完全來(lái)編寫(xiě)一個(gè)ErrorController的實(shí)現(xiàn)類【或者是編寫(xiě)AbstractErrorController的子類】,放在容器中;
2、頁(yè)面上能用的數(shù)據(jù),或者是json返回能用的數(shù)據(jù)都是通過(guò)errorAttributes.getErrorAttributes得到;
容器中DefaultErrorAttributes.getErrorAttributes();默認(rèn)進(jìn)行數(shù)據(jù)處理的;
自定義ErrorAttributes
package cn.jfjb.crud.component; import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; import org.springframework.stereotype.Component; import org.springframework.web.context.request.WebRequest; import java.util.Map; /** * @author john * @date 2019/11/24 - 12:13 */ @Component public class MyErrorAttributes extends DefaultErrorAttributes { @Override public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) { Map<String, Object> map = super.getErrorAttributes(webRequest, includeStackTrace); //獲取自定義處理異常傳遞的參數(shù) Map<String, Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0); map.put("company", "atguigu"); map.put("ext", ext); return map; } }
4. 配置application.yml
server: error: include-exception: true
5. 編寫(xiě)4xx.html自定義錯(cuò)誤頁(yè)面
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>4xx</title> </head> <body> <h1>status:[[${status}]]</h1> <h2>timestamp:[[${timestamp}]]</h2> <h2>exception:[[${exception}]]</h2> <h2>message:[[${message}]]</h2> </body> </html>
6. 測(cè)試
package cn.jfjb.crud.controller; import cn.jfjb.crud.exception.UserNotExistException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @author john * @date 2019/11/22 - 19:38 */ @Controller public class HelloController { @RequestMapping({"/testException"}) public String testException(@RequestParam("user") String user) { if (user != "aaa") { throw new UserNotExistException(); } return "index"; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java報(bào)錯(cuò):ClassCastException問(wèn)題解決方法
異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并且錯(cuò)誤有時(shí)候是可以避免的,下面這篇文章主要給大家介紹了關(guān)于Java報(bào)錯(cuò):ClassCastException問(wèn)題解決方法,需要的朋友可以參考下2024-07-07SpringBoot前后端接口對(duì)接常見(jiàn)錯(cuò)誤小結(jié)
SpringBoot前后端接口對(duì)接工作時(shí),經(jīng)常遇到請(qǐng)求500,400等問(wèn)題,本文主要介紹了SpringBoot前后端接口對(duì)接常見(jiàn)錯(cuò)誤小結(jié),感興趣的可以了解一下2022-01-01springBoot項(xiàng)目中的全局異常處理和自定義異常處理實(shí)現(xiàn)
異常是由于程序邏輯錯(cuò)誤、運(yùn)行環(huán)境問(wèn)題、用戶輸入錯(cuò)誤等原因?qū)е碌囊环N非正常的狀態(tài)或事件,本文主要介紹了springBoot項(xiàng)目中的全局異常處理和自定義異常處理實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08Java中使用JDBC操作數(shù)據(jù)庫(kù)簡(jiǎn)單實(shí)例
這篇文章主要介紹了Java中使用JDBC操作數(shù)據(jù)庫(kù)簡(jiǎn)單實(shí)例,本文以Mysql為例介紹使用Java JDBC操作數(shù)據(jù)庫(kù)的6個(gè)步驟,需要的朋友可以參考下2015-06-06SpringBoot開(kāi)發(fā)中使用DTO層的方法示例
DTO層是在應(yīng)用程序的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層之間引入的一個(gè)中間層,用于在不同層之間傳輸數(shù)據(jù),本文主要介紹了SpringBoot開(kāi)發(fā)中使用DTO層,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06