SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理
在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 */@ControllerAdvicepublic 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; }}
啟動(dòng)應(yīng)用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都會(huì)作用在 被 @RequestMapping 注解的方法上。
@ModelAttribute:在Model上設(shè)置的值,對(duì)于所有被 @RequestMapping 注解的方法中,都可以通過(guò) ModelMap 獲取,如下:
@RequestMapping('/home')public String home(ModelMap modelMap) { System.out.println(modelMap.get('author'));}//或者 通過(guò)@ModelAttribute獲取@RequestMapping('/home')public String home(@ModelAttribute('author') String author) { System.out.println(author);}
@ExceptionHandler 攔截了異常,我們可以通過(guò)該注解實(shí)現(xiàn)自定義異常處理。其中,@ExceptionHandler 配置的 value 指定需要攔截的異常類型,上面攔截了 Exception.class 這種異常。
二、自定義異常處理(全局異常處理)
spring boot 默認(rèn)情況下會(huì)映射到 /error 進(jìn)行異常處理,但是提示并不十分友好,下面自定義異常處理,提供友好展示。
1、編寫(xiě)自定義異常類:
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 對(duì)于 RuntimeException 異常才會(huì)進(jìn)行事務(wù)回滾。
2、編寫(xiě)全局異常處理類
創(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 */@ControllerAdvicepublic 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)行測(cè)試。
@RequestMapping('/home')public String home() throws Exception {// throw new Exception('Sam 錯(cuò)誤'); throw new MyException('101', 'Sam 錯(cuò)誤');}
啟動(dòng)應(yīng)用,訪問(wèn):http://localhost:8080/home ,正常顯示以下json內(nèi)容,證明自定義異常已經(jīng)成功被攔截。
{'msg':'Sam 錯(cuò)誤','code':'101'}
* 如果不需要返回json數(shù)據(jù),而要渲染某個(gè)頁(yè)面模板返回給瀏覽器,那么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>錯(cuò)誤頁(yè)面</title></head><body> <h1>$[code]</h1> <h1>${msg}</h1></body></html>
重啟應(yīng)用,http://localhost:8080/home 顯示自定的錯(cuò)誤頁(yè)面內(nèi)容。
補(bǔ)充:如果全部異常處理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,這樣在方法上就可以不需要添加 @ResponseBody。
到此這篇關(guān)于SpringBoot @ControllerAdvice 攔截異常并統(tǒng)一處理的文章就介紹到這了,更多相關(guān)SpringBoot @ControllerAdvice 攔截異常內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. idea打開(kāi)多個(gè)窗口的操作方法2. idea修改背景顏色樣式的方法3. IntelliJ IDEA調(diào)整字體大小的方法4. IntelliJ IDEA創(chuàng)建web項(xiàng)目的方法5. idea設(shè)置代碼格式化的方法步驟6. Django使用HTTP協(xié)議向服務(wù)器傳參方式小結(jié)7. VMware中如何安裝Ubuntu8. IntelliJ IDEA刪除類的方法步驟9. 使用IDEA編寫(xiě)jsp時(shí)EL表達(dá)式不起作用的問(wèn)題及解決方法10. 解析原生JS getComputedStyle

網(wǎng)公網(wǎng)安備