亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

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

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

在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定義@ExceptionHandler、@InitBinder、@ModelAttribute,并應用到所有@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 增強器 * @author sam * @since 2017/7/17 */@ControllerAdvicepublic class MyControllerAdvice { /** * 應用到所有@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; }}

啟動應用后,被 @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 攔截了異常,我們可以通過該注解實現(xiàn)自定義異常處理。其中,@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、編寫全局異常處理類

創(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 增強器 * * @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內容,證明自定義異常已經(jīng)成功被攔截。

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

* 如果不需要返回json數(shù)據(jù),而要渲染某個頁面模板返回給瀏覽器,那么MyControllerAdvice中可以這么實現(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) 進行渲染:

<!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 攔截異常并統(tǒng)一處理的文章就介紹到這了,更多相關SpringBoot @ControllerAdvice 攔截異常內容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關文章:
主站蜘蛛池模板: 特黄特色一级特色大片中文 | 欧美一级毛片兔费播放 | 99久久中文字幕伊人情人 | 黄色动作视频 | 成人丝袜激情一区二区 | 中国美女毛片 | 91精品国产视频 | 国产成人精品曰本亚洲78 | 久久久久久在线 | 91国偷自产一区二区三区蜜臀 | 亚洲视频一区在线观看 | 夜恋秀场欧美成人影院 | 国产美女无遮挡免费视频网站 | 日韩一级黄色影片 | 国产精品不卡视频 | 色综合久久综合中文小说 | 亚洲精品国产一区二区三区四区 | 国产精品成人免费视频不卡 | 黄网在线看 | 久久亚洲精品23p | 日本大学生免费一级一片 | 国产系列欧美系列日韩系列在线 | 久爱午夜精品免费视频 | 欧美伦理片在线播放 | 欧美女交| 国产好大好爽久久久久久久 | 久久大香萑太香蕉综合网 | 亚洲 日本 欧美 日韩精品 | 午夜性影院 | 国产乱辈通伦影片在线播放 | 中国女人a毛片免费全部播放 | 免费视频国产 | 曰曰啪天天拍视频在线 | 中文字幕亚洲精品 | 欧美成人午夜做爰视频在线观看 | 99久久综合九九亚洲 | 欧美成人禁片在线观看俄罗斯 | 在线视频亚洲欧美 | 又黄又爽的成人免费网站 | 国产这里有精品 | 一级片免费网址 |