欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理

 更新時(shí)間:2020年09月15日 10:46:08   作者:神奇Sam  
這篇文章主要介紹了SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定義@ExceptionHandler、@InitBinder、@ModelAttribute,并應(yīng)用到所有@RequestMapping中。參考:@ControllerAdvice 文檔

一、介紹

創(chuàng)建 MyControllerAdvice,并添加 @ControllerAdvice注解。

package com.sam.demo.controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;

/**
 * controller 增強(qiáng)器
 * @author sam
 * @since 2017/7/17
 */
@ControllerAdvice
public class MyControllerAdvice {

 /**
  * 應(yīng)用到所有@RequestMapping注解方法,在其執(zhí)行之前初始化數(shù)據(jù)綁定器
  * @param binder
  */
 @InitBinder
 public void initBinder(WebDataBinder binder) {}

 /**
  * 把值綁定到Model中,使全局@RequestMapping可以獲取到該值
  * @param model
  */
 @ModelAttribute
 public void addAttributes(Model model) {
  model.addAttribute("author", "Magical Sam");
 }

 /**
  * 全局異常捕捉處理
  * @param ex
  * @return
  */
 @ResponseBody
 @ExceptionHandler(value = Exception.class)
 public Map errorHandler(Exception ex) {
  Map map = new HashMap();
  map.put("code", 100);
  map.put("msg", ex.getMessage());
  return map;
 }

}

啟動應(yīng)用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都會作用在 被 @RequestMapping 注解的方法上。

@ModelAttribute:在Model上設(shè)置的值,對于所有被 @RequestMapping 注解的方法中,都可以通過 ModelMap 獲取,如下:

@RequestMapping("/home")
public String home(ModelMap modelMap) {
 System.out.println(modelMap.get("author"));
}

//或者 通過@ModelAttribute獲取

@RequestMapping("/home")
public String home(@ModelAttribute("author") String author) {
 System.out.println(author);
}

@ExceptionHandler 攔截了異常,我們可以通過該注解實(shí)現(xiàn)自定義異常處理。其中,@ExceptionHandler 配置的 value 指定需要攔截的異常類型,上面攔截了 Exception.class 這種異常。

二、自定義異常處理(全局異常處理)

spring boot 默認(rèn)情況下會映射到 /error 進(jìn)行異常處理,但是提示并不十分友好,下面自定義異常處理,提供友好展示。

1、編寫自定義異常類:

package com.sam.demo.custom;

/**
 * @author sam
 * @since 2017/7/17
 */
public class MyException extends RuntimeException {

 public MyException(String code, String msg) {
  this.code = code;
  this.msg = msg;
 }

 private String code;
 private String msg;

 // getter & setter
}

注:spring 對于 RuntimeException 異常才會進(jìn)行事務(wù)回滾。

2、編寫全局異常處理類

創(chuàng)建 MyControllerAdvice.java,如下:

package com.sam.demo.controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * controller 增強(qiáng)器
 *
 * @author sam
 * @since 2017/7/17
 */
@ControllerAdvice
public class MyControllerAdvice {

 /**
  * 全局異常捕捉處理
  * @param ex
  * @return
  */
 @ResponseBody
 @ExceptionHandler(value = Exception.class)
 public Map errorHandler(Exception ex) {
  Map map = new HashMap();
  map.put("code", 100);
  map.put("msg", ex.getMessage());
  return map;
 }
 
 /**
  * 攔截捕捉自定義異常 MyException.class
  * @param ex
  * @return
  */
 @ResponseBody
 @ExceptionHandler(value = MyException.class)
 public Map myErrorHandler(MyException ex) {
  Map map = new HashMap();
  map.put("code", ex.getCode());
  map.put("msg", ex.getMsg());
  return map;
 }

}

3、controller中拋出異常進(jìn)行測試。

@RequestMapping("/home")
public String home() throws Exception {

//  throw new Exception("Sam 錯誤");
 throw new MyException("101", "Sam 錯誤");

}

啟動應(yīng)用,訪問:http://localhost:8080/home ,正常顯示以下json內(nèi)容,證明自定義異常已經(jīng)成功被攔截。

{"msg":"Sam 錯誤","code":"101"}

* 如果不需要返回json數(shù)據(jù),而要渲染某個頁面模板返回給瀏覽器,那么MyControllerAdvice中可以這么實(shí)現(xiàn):

@ExceptionHandler(value = MyException.class)
public ModelAndView myErrorHandler(MyException ex) {
 ModelAndView modelAndView = new ModelAndView();
 modelAndView.setViewName("error");
 modelAndView.addObject("code", ex.getCode());
 modelAndView.addObject("msg", ex.getMsg());
 return modelAndView;
}

在 templates 目錄下,添加 error.ftl(這里使用freemarker) 進(jìn)行渲染:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>錯誤頁面</title>
</head>
<body>
 <h1>$[code]</h1>
 <h1>${msg}</h1>
</body>
</html>

重啟應(yīng)用,http://localhost:8080/home 顯示自定的錯誤頁面內(nèi)容。

補(bǔ)充:如果全部異常處理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,這樣在方法上就可以不需要添加 @ResponseBody。

到此這篇關(guān)于SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理的文章就介紹到這了,更多相關(guān)SpringBoot @ControllerAdvice 攔截異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何解決異步任務(wù)上下文丟失問題

    如何解決異步任務(wù)上下文丟失問題

    在多線程編程中,異步任務(wù)可能會導(dǎo)致上下文信息丟失,為了解決這個問題,可以在執(zhí)行異步任務(wù)前,通過自定義TaskDecorator拷貝主線程的上下文至子線程,這樣可以確保上下文在異步執(zhí)行過程中得以保留,將定制的TaskDecorator設(shè)置至線程池,可以有效地解決上下文丟失問題
    2024-09-09
  • Java阻塞隊(duì)列BlockingQueue詳解

    Java阻塞隊(duì)列BlockingQueue詳解

    這篇文章主要介紹了Java阻塞隊(duì)列BlockingQueue,文章通過隊(duì)列的類型展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • 阿里SpringBoot應(yīng)用自動化部署實(shí)現(xiàn)IDEA版Jenkins

    阿里SpringBoot應(yīng)用自動化部署實(shí)現(xiàn)IDEA版Jenkins

    這篇文章主要為大家介紹了阿里SpringBoot應(yīng)用自動化部署實(shí)現(xiàn)IDEA版Jenkins過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • SpringBoot實(shí)現(xiàn)郵件推送的詳細(xì)代碼

    SpringBoot實(shí)現(xiàn)郵件推送的詳細(xì)代碼

    在項(xiàng)目中經(jīng)常會遇到SpringBoot推送消息的業(yè)務(wù),除了站內(nèi)推送通知,郵件推送也是一種常見的方式,本文小編就帶大家實(shí)現(xiàn)郵件推送,文中有詳細(xì)代碼講解,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • springboot?通過博途獲取plc點(diǎn)位的數(shù)據(jù)代碼實(shí)現(xiàn)

    springboot?通過博途獲取plc點(diǎn)位的數(shù)據(jù)代碼實(shí)現(xiàn)

    這篇文章主要介紹了springboot?通過博途獲取plc點(diǎn)位的數(shù)據(jù)的代碼實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java中json使用方法_動力節(jié)點(diǎn)Java學(xué)院整理

    Java中json使用方法_動力節(jié)點(diǎn)Java學(xué)院整理

    JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式, json是個非常重要的數(shù)據(jù)結(jié)構(gòu),在web開發(fā)中應(yīng)用十分廣泛。下面通過本文給大家講解Java中json使用方法,感興趣的朋友一起看看吧
    2017-07-07
  • 使用HandlerMethodArgumentResolver用于統(tǒng)一獲取當(dāng)前登錄用戶

    使用HandlerMethodArgumentResolver用于統(tǒng)一獲取當(dāng)前登錄用戶

    這篇文章主要介紹了使用HandlerMethodArgumentResolver用于統(tǒng)一獲取當(dāng)前登錄用戶實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 如何利用JAVA實(shí)現(xiàn)走迷宮程序

    如何利用JAVA實(shí)現(xiàn)走迷宮程序

    最近經(jīng)常在機(jī)房看同學(xué)在玩一個走迷宮的游戲,比較有趣,自己也用java實(shí)現(xiàn)了一個,這篇文章主要給大家介紹了關(guān)于如何利用JAVA實(shí)現(xiàn)走迷宮程序的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 史上最全Java8日期時(shí)間工具類(分享)

    史上最全Java8日期時(shí)間工具類(分享)

    這篇文章主要介紹了史上最全Java8日期時(shí)間工具類(分享),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java解析XML詳解

    java解析XML詳解

    這篇文章主要介紹了XML解析四種方式代碼示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-07-07

最新評論