成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

SpringBoot統(tǒng)一異常處理

SpringBoot 統(tǒng)一異常處理
SpringBoot 統(tǒng)一異常處理
異常和響應(yīng)碼

創(chuàng)新互聯(lián)建站專注于企業(yè)成都營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、恩平網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為恩平等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

因?yàn)橛肦ESTful設(shè)計(jì)的接口, 應(yīng)該用狀態(tài)碼反映請(qǐng)求的錯(cuò)誤, 不應(yīng)該統(tǒng)一返回200 的狀態(tài)碼, 然后再通過 msg 來描述錯(cuò)誤. 所以統(tǒng)一異常處理比較關(guān)鍵.

異常一般分為 業(yè)務(wù)異常 和 非業(yè)務(wù)異常
SpringBoot 統(tǒng)一異常處理
業(yè)務(wù)異常通常返回4xx的狀態(tài)碼
非業(yè)務(wù)異常只需要返回 500 , 提示 服務(wù)器錯(cuò)誤,請(qǐng)稍候重試
默認(rèn)異常處理
SpringBoot 提供了默認(rèn)的處理異常方式,當(dāng)出現(xiàn)異常時(shí)就會(huì)默認(rèn)映射到 /error。處理異常的程序在類BasicErrorController 中.
該類提供了兩種異常處理的方法 :

方法 errorHtml 用于處理瀏覽器端請(qǐng)求時(shí)出現(xiàn)的異常.
方法 error 用于處理機(jī)器客戶端請(qǐng)求時(shí)出現(xiàn)的異常。

這兩種請(qǐng)求的的區(qū)別在于請(qǐng)求頭中 Accept 的值 :

值為 text/html 時(shí),方法 errorHtml 執(zhí)行,返回 HTML 頁面。
值為 application/json 時(shí),方法 error 執(zhí)行,返回 json 數(shù)據(jù)。

errorHtml 和 error 兩個(gè)方法的源代碼

@RequestMapping(produces = "text/html")
public ModelAndView errorHtml(HttpServletRequest request,
HttpServletResponse response) {
HttpStatus status = getStatus(request);
Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
response.setStatus(status.value());
ModelAndView modelAndView = resolveErrorView(request, response, status, model);
return (modelAndView != null) ? modelAndView : new ModelAndView("error", model);
}

@RequestMapping
@ResponseBody
public ResponseEntity&lt;Map&lt;String, Object&gt;&gt; error(HttpServletRequest request) {
    Map&lt;String, Object&gt; body = getErrorAttributes(request,
            isIncludeStackTrace(request, MediaType.ALL));
    HttpStatus status = getStatus(request);
    return new ResponseEntity&lt;&gt;(body, status);
}

瀏覽器端錯(cuò)誤頁面

SpringBoot 統(tǒng)一異常處理

如果想自定義頁面替換這個(gè)頁面, 你只需在 /error 文件夾下添加一個(gè)表示錯(cuò)誤頁面的文件。該文件可以是一個(gè)靜態(tài)的HTML,也可以使用模板。這個(gè)文件的名字應(yīng)該是精確的狀態(tài)碼或者是表示一個(gè)系列的模糊名稱。如下:

src/
+- main/
+- java/
| + <source code>
+- resources/
+- public/
+- error/
| +- 404.html
+- <other public assets>

src/
+- main/
+- java/
| + <source code>
+- resources/
+- templates/
+- error/
| +- 5xx.ftl
+- <other templates>

其背后的原理在于上面提到的 errorHtml 方法。當(dāng)出現(xiàn)異常時(shí),該方法會(huì)查詢是否有在 error 文件夾下提供對(duì)應(yīng)錯(cuò)誤狀態(tài)碼的靜態(tài)資源文件,如果有則返回該文件,沒有則返回上小節(jié)講到的白色錯(cuò)誤標(biāo)簽頁。如果想要知道更詳細(xì)的細(xì)節(jié)請(qǐng)查看相關(guān)源碼。
JSON格式錯(cuò)誤
當(dāng)請(qǐng)求頭中的Accept的值為 application/json 時(shí),就會(huì)返回 json 數(shù)據(jù)了。出現(xiàn)異常時(shí),BasicErrorController 類中的 error 方法將被執(zhí)行。會(huì)獲取錯(cuò)誤信息然后以 Json 格式返回。如下圖:

SpringBoot 統(tǒng)一異常處理

自定義異常處理
下面有兩種方式自定義異常處理

對(duì)于應(yīng)用級(jí)別的業(yè)務(wù)異常處理,我們可以通過注解 @ControllerAdvice 或 @RestControllerAdvice 來實(shí)現(xiàn)異常處理。但是上面的注解只能捕獲處理應(yīng)用級(jí)別的異常,例如 Controller 中拋出自定義的異常。卻不能處理容器級(jí)別的異常,例如 Filter 中拋出的異常等。
要想處理容器級(jí)別的異常,需要繼承 BasicErrorController 類,重寫 errorHtml 和 error 方法。或者實(shí)現(xiàn) ErrorController 接口,起到和類 BasicErrorController 相似的作用。

處理應(yīng)用級(jí)別異常

下面是返回 JSON 格式的處理類@RestControllerAdvice
br/>@RestControllerAdvice

private static final long serialVersionUID = 1L;

@ExceptionHandler(value = MissingServletRequestParameterException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public R defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
    return new R<>(null, "缺少參數(shù)");
}

}

@RestControllerAdvice 與 @ControllerAdvice +@ResponseBody 起到的作用是一樣的
注解 @ExceptionHandler 里面的 value 的類是我們捕獲的處理異常, 此類異常會(huì)被defaultErrorHandler 方法處理.

@ResponseStatus(HttpStatus.BAD_REQUEST) 注解, 指定了此異常返回的狀態(tài)碼, 因?yàn)槭侨鄙賲?shù), 所以返回 400 的狀態(tài)碼

R 類為一個(gè) ResultJSON 類, 把內(nèi)容封裝起來, 一般有 code, meg , data 三個(gè)屬性. 返回一個(gè) JSON 字符串
處理容器級(jí)別的異常
@ControllerAdvice 注解的異常處理類并不能處理容器級(jí)別的異常, 我們可以通過繼承 BasicErrorController 類重寫 errorHtml 或 error 方法,以達(dá)到我們想要的返回結(jié)果。

還可以通過實(shí)現(xiàn) ErrorController 接口的方法來實(shí)現(xiàn)自定義異常處理,BasicErrorController 類也是實(shí)現(xiàn)了 ErrorController 接口,因此這種方式和 BasicErrorController 類有相似作用。實(shí)現(xiàn)起來相對(duì)麻煩,本文只講解繼承 BasicErrorController 類的方式。

@Controller
public class CustomizeErrorController extends BasicErrorController{

public CustomizeErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties, List<ErrorViewResolver> errorViewResolvers){
    super(errorAttributes, errorProperties, errorViewResolvers);
}

@RequestMapping(produces = {"text/html"})
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
    HttpStatus status = this.getStatus(request);
    Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
    response.setStatus(status.value());
    ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
    return modelAndView == null ? new ModelAndView("error", model) : modelAndView;
}

@RequestMapping
@ResponseBody
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
    HttpStatus status = this.getStatus(request);
    ApiResponseBody responseBody = new ApiResponseBody((int)body.get("status"), (String) body.get("error") + ": " + (String) body.get("message"));
    return new ResponseEntity(responseBody, status);
}

}

該類將會(huì)覆蓋 BasicErrorController 類起到處理異常的作用。但這里要注意,如果想要保留對(duì)SpringBoot默認(rèn)的對(duì)瀏覽器請(qǐng)求的異常處理(也就是根據(jù)異常錯(cuò)誤狀態(tài)碼返回 error 文件夾下對(duì)應(yīng)的錯(cuò)誤頁面),還需新建一個(gè)配置文件 CustomErrorConfiguration

@Configuration@ConditionalOnWebApplication
br/>@ConditionalOnWebApplication
br/>@AutoConfigureBefore({WebMvcAutoConfiguration.class})
public class CustomErrorConfiguration {
private final ServerProperties serverProperties;
private final List<ErrorViewResolver> errorViewResolvers;

public CustomErrorConfiguration(ServerProperties serverProperties, ObjectProvider&lt;List&lt;ErrorViewResolver&gt;&gt; errorViewResolversProvider) {
    this.serverProperties = serverProperties;
    this.errorViewResolvers = (List)errorViewResolversProvider.getIfAvailable();
}

@Bean
public CustomizeErrorController customizeErrorController(ErrorAttributes errorAttributes){
    return new CustomizeErrorController(errorAttributes, this.serverProperties.getError(),errorViewResolvers);
}

}

文章名稱:SpringBoot統(tǒng)一異常處理
文章出自:http://jinyejixie.com/article24/psgcce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)站營(yíng)銷、App開發(fā)、定制開發(fā)品牌網(wǎng)站制作、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
连州市| 老河口市| 榆林市| 榆中县| 泉州市| 洛扎县| 乌拉特前旗| 宣武区| 宣武区| 山东| 太原市| 浦江县| 西昌市| 广西| 腾冲县| 旬邑县| 甘孜| 腾冲县| 凤阳县| 容城县| 河池市| 兴山县| 察哈| 荆门市| 台东市| 新津县| 林甸县| 嘉黎县| 松原市| 清丰县| 湟源县| 搜索| 固始县| 景宁| 浦东新区| 左云县| 万全县| 龙海市| 平阴县| 浑源县| 阿瓦提县|