久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 jackeyqing 2020-06-08

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

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

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

@ModelAttribute:在Model上設置的值,,對于所有被 @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 默認情況下會映射到 /error 進行異常處理,,但是提示并不十分友好,下面自定義異常處理,,提供友好展示,。

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

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

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

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

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

  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>

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

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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多