av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

SpringBoot @ControllerAdvice 攔截異常并統一處理

瀏覽:55日期:2023-04-25 10:38:02

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

一、介紹

創建 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 增強器 * @author sam * @since 2017/7/17 */@ControllerAdvicepublic class MyControllerAdvice { /** * 應用到所有@RequestMapping注解方法,在其執行之前初始化數據綁定器 * @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; }}

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

@ModelAttribute:在Model上設置的值,對于所有被 @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 攔截了異常,我們可以通過該注解實現自定義異常處理。其中,@ExceptionHandler 配置的 value 指定需要攔截的異常類型,上面攔截了 Exception.class 這種異常。

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

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

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 異常才會進行事務回滾。

2、編寫全局異常處理類

創建 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 增強器 * * @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中拋出異常進行測試。

@RequestMapping('/home')public String home() throws Exception {// throw new Exception('Sam 錯誤'); throw new MyException('101', 'Sam 錯誤');}

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

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

* 如果不需要返回json數據,而要渲染某個頁面模板返回給瀏覽器,那么MyControllerAdvice中可以這么實現:

@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) 進行渲染:

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

重啟應用,http://localhost:8080/home 顯示自定的錯誤頁面內容。

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

到此這篇關于SpringBoot @ControllerAdvice 攔截異常并統一處理的文章就介紹到這了,更多相關SpringBoot @ControllerAdvice 攔截異常內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 日韩精品在线一区 | 天天天天天天天干 | 久久久国产一区二区三区 | 一区二区三区日 | 日韩一区二区av | 中文字幕的av | 亚洲精品视频网站在线观看 | 国产一区二区在线免费播放 | 欧美久久电影 | 欧美视频精品 | 欧美二区在线 | 国产亚洲一区二区三区在线观看 | 亚洲精品欧美精品 | 国产激情一区二区三区 | 亚洲成人一区二区 | 午夜资源| 九九久久精品 | 91精品久久久久久久 | 免费一级黄色 | 91精品国产色综合久久 | 天天曰天天干 | 日韩电影中文字幕 | 国产一区二区黑人欧美xxxx | 最新中文字幕在线播放 | 久久亚洲欧美日韩精品专区 | 国产999精品久久久 精品三级在线观看 | 国产98色在线 | 日韩 | 三级av网址 | 99久久99热这里只有精品 | 亚洲 中文 欧美 日韩 在线观看 | 久久精品国产一区二区电影 | 日韩av一二三区 | 精品欧美乱码久久久久久 | av一级 | 亚洲一区二区中文字幕在线观看 | 人人九九精 | 亚洲高清视频在线观看 | 欧美区日韩区 | 日日摸日日碰夜夜爽2015电影 | 99这里只有精品视频 | 一区二区三区视频在线观看 |