一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

springboot中攔截異常并統(tǒng)一處理

 jackeyqing 2020-06-08

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

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

一、介紹

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

  1. package com.sam.demo.controller;
  2. import org.springframework.ui.Model;
  3. import org.springframework.web.bind.WebDataBinder;
  4. import org.springframework.web.bind.annotation.*;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * controller 增強(qiáng)器
  9. * @author sam
  10. * @since 2017/7/17
  11. */
  12. @ControllerAdvice
  13. public class MyControllerAdvice {
  14. /**
  15. * 應(yīng)用到所有@RequestMapping注解方法,在其執(zhí)行之前初始化數(shù)據(jù)綁定器
  16. * @param binder
  17. */
  18. @InitBinder
  19. public void initBinder(WebDataBinder binder) {}
  20. /**
  21. * 把值綁定到Model中,使全局@RequestMapping可以獲取到該值
  22. * @param model
  23. */
  24. @ModelAttribute
  25. public void addAttributes(Model model) {
  26. model.addAttribute("author", "Magical Sam");
  27. }
  28. /**
  29. * 全局異常捕捉處理
  30. * @param ex
  31. * @return
  32. */
  33. @ResponseBody
  34. @ExceptionHandler(value = Exception.class)
  35. public Map errorHandler(Exception ex) {
  36. Map map = new HashMap();
  37. map.put("code", 100);
  38. map.put("msg", ex.getMessage());
  39. return map;
  40. }
  41. }

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

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

  1. @RequestMapping("/home")
  2. public String home(ModelMap modelMap) {
  3. System.out.println(modelMap.get("author"));
  4. }
  5. //或者 通過@ModelAttribute獲取
  6. @RequestMapping("/home")
  7. public String home(@ModelAttribute("author") String author) {
  8. System.out.println(author);
  9. }

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

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

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

1、編寫自定義異常類:

  1. package com.sam.demo.custom;
  2. /**
  3. * @author sam
  4. * @since 2017/7/17
  5. */
  6. public class MyException extends RuntimeException {
  7. public MyException(String code, String msg) {
  8. this.code = code;
  9. this.msg = msg;
  10. }
  11. private String code;
  12. private String msg;
  13. // getter & setter
  14. }

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

2、編寫全局異常處理類

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

  1. package com.sam.demo.controller;
  2. import org.springframework.ui.Model;
  3. import org.springframework.web.bind.WebDataBinder;
  4. import org.springframework.web.bind.annotation.*;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. /**
  8. * controller 增強(qiáng)器
  9. *
  10. * @author sam
  11. * @since 2017/7/17
  12. */
  13. @ControllerAdvice
  14. public class MyControllerAdvice {
  15. /**
  16. * 全局異常捕捉處理
  17. * @param ex
  18. * @return
  19. */
  20. @ResponseBody
  21. @ExceptionHandler(value = Exception.class)
  22. public Map errorHandler(Exception ex) {
  23. Map map = new HashMap();
  24. map.put("code", 100);
  25. map.put("msg", ex.getMessage());
  26. return map;
  27. }
  28. /**
  29. * 攔截捕捉自定義異常 MyException.class
  30. * @param ex
  31. * @return
  32. */
  33. @ResponseBody
  34. @ExceptionHandler(value = MyException.class)
  35. public Map myErrorHandler(MyException ex) {
  36. Map map = new HashMap();
  37. map.put("code", ex.getCode());
  38. map.put("msg", ex.getMsg());
  39. return map;
  40. }
  41. }

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

  1. @RequestMapping("/home")
  2. public String home() throws Exception {
  3. // throw new Exception("Sam 錯誤");
  4. throw new MyException("101", "Sam 錯誤");
  5. }

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

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

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

  1. @ExceptionHandler(value = MyException.class)
  2. public ModelAndView myErrorHandler(MyException ex) {
  3. ModelAndView modelAndView = new ModelAndView();
  4. modelAndView.setViewName("error");
  5. modelAndView.addObject("code", ex.getCode());
  6. modelAndView.addObject("msg", ex.getMsg());
  7. return modelAndView;
  8. }

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

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>錯誤頁面</title>
  6. </head>
  7. <body>
  8. <h1>${code}</h1>
  9. <h1>${msg}</h1>
  10. </body>
  11. </html>

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

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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美黄色成人真人视频| 日韩精品你懂的在线观看| 国产又大又硬又粗又湿| 精品人妻一区二区三区免费看| 国产成人精品国内自产拍| 中文字幕一二区在线观看| 欧美加勒比一区二区三区| 大香蕉网国产在线观看av| 麻豆印象传媒在线观看| 91日韩在线视频观看| 国产一级不卡视频在线观看| 福利视频一区二区三区| 日本在线高清精品人妻| 亚洲天堂精品1024| 人妻乱近亲奸中文字幕| 亚洲天堂精品在线视频| 中文字幕人妻综合一区二区| 亚洲一区二区精品国产av| 国产又粗又猛又爽又黄的文字| 可以在线看的欧美黄片| 男女午夜在线免费观看视频| 激情五月天深爱丁香婷婷| 中文字幕91在线观看| 91人妻人人澡人人人人精品| 国产一区二区三区不卡| 欧美欧美日韩综合一区| 国产成人精品在线一区二区三区| 欧美日韩亚洲精品在线观看| 精品少妇一区二区三区四区| 亚洲精品国产主播一区| 亚洲国产精品久久网午夜| 九九热这里只有精品视频| 极品少妇嫩草视频在线观看| 九九热这里只有精品视频| 国产一区二区三区草莓av| 国产农村妇女成人精品| 中文日韩精品视频在线| 国产在线一区二区免费| 亚洲美女国产精品久久| 中国美女偷拍福利视频| 精品欧美国产一二三区|