SpringBoot项目中的非常处置处罚

打印 上一主题 下一主题

主题 1029|帖子 1029|积分 3087

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
定义错误页面

SpringBoot 默认的处置处罚非常的机制:SpringBoot 默认的已经提供了一套处置处罚非常的机制。一旦步伐中出现了非常 SpringBoot 会像/error 的 url 发送哀求。在 springBoot 中提供了一个叫 BasicExceptionController 来处置处罚/error 哀求,然后跳转到默认显示非常的页面来展示非常信息

如 果 我 们 需 要 将 所 有 的 异 常 同 一 跳 转 到 自 定 义 的 错 误 页 面 , 需 要 在src/main/resources/templates 目录下创建 error.html 页面。注意:名称必须叫 error
 
 @ExceptionHandler 处置处罚


针对特定的非常做出不同的处置处罚,我们可以通过@ExceptionHandle来处置处罚实现,具体如下
  1. @Controller
  2. public class UserController {
  3.     /**
  4.      * 模拟 NullPointerException
  5.      * @return
  6.      */
  7.     @RequestMapping("/show1")
  8.     public String showInfo(){
  9.         String str = null;
  10.         str.length();
  11.         return "index";
  12.     }
  13.     /**
  14.      * 模拟 ArithmeticException
  15.      * @return
  16.      */
  17.     @RequestMapping("/show2")
  18.     public String showInfo2(){
  19.         int a = 10/0;
  20.         return "index";
  21.     }
  22.     /**
  23.      * java.lang.ArithmeticException
  24.      * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定
  25.      * 参数 Exception e:会将产生异常对象注入到方法中
  26.      */
  27.     @ExceptionHandler(value={java.lang.ArithmeticException.class})
  28.     public ModelAndView arithmeticExceptionHandler(Exception e){
  29.         ModelAndView mv = new ModelAndView();
  30.         mv.addObject("error", e.toString());
  31.         mv.setViewName("error1");
  32.         return mv;
  33.     }
  34.     /**
  35.      * java.lang.NullPointerException
  36.      * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视
  37.      图的指定
  38.      * 参数 Exception e:会将产生异常对象注入到方法中
  39.      */
  40.     @ExceptionHandler(value={java.lang.NullPointerException.class})
  41.     public ModelAndView nullPointerExceptionHandler(Exception e){
  42.         ModelAndView mv = new ModelAndView();
  43.         mv.addObject("error", e.toString());
  44.         mv.setViewName("error2");
  45.         return mv;
  46.     }
  47. }
复制代码
 错误页面
  1. <!DOCTYPE html>
  2. <html lang="en" >
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>错误页面</title>
  6. </head>
  7. <body>
  8. 出错了,请与管理员联系。。。错误提示页面-ArithmeticException<br>
  9. <span th:text="${error}"></span>
  10. </body>
  11. </html>
复制代码
  1. <!DOCTYPE html>
  2. <html lang="en" >
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>错误页面</title>
  6. </head>
  7. <body>
  8. 出错了,请与管理员联系。。。错误提示页面-NullPointerException <br>
  9. <span th:text="${error}"></span>
  10. </body>
  11. </html>
复制代码
 

 @ControllerAdvice+@ExceptionHandler处置处罚


第二种处置处罚方式中,非常处置处罚的代码和业务代码放在一个类中了,这种方式耦合性太强了,最好是将业务和非常处置处罚的代码分离开,这时我们可以定义一个专门的非常处置处罚类,通过注解@ControllerAdvice来实现。具体如下:
  1. @ControllerAdvice
  2. public class GlobalException {
  3.     /**
  4.      * java.lang.ArithmeticException
  5.      * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定
  6.      * 参数 Exception e:会将产生异常对象注入到方法中
  7.      */
  8.     @ExceptionHandler(value={java.lang.ArithmeticException.class})
  9.     public ModelAndView arithmeticExceptionHandler(Exception e){
  10.         ModelAndView mv = new ModelAndView();
  11.         mv.addObject("error", e.toString()+" -- advice");
  12.         mv.setViewName("error1");
  13.         return mv;
  14.     }
  15.     /**
  16.      * java.lang.NullPointerException
  17.      * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视
  18.      图的指定
  19.      * 参数 Exception e:会将产生异常对象注入到方法中
  20.      */
  21.     @ExceptionHandler(value={java.lang.NullPointerException.class})
  22.     public ModelAndView nullPointerExceptionHandler(Exception e){
  23.         ModelAndView mv = new ModelAndView();
  24.         mv.addObject("error", e.toString()+" -- advice");
  25.         mv.setViewName("error2");
  26.         return mv;
  27.     }
  28. }
复制代码
控制器中实现
  1. @Controller
  2. public class UserController {
  3.     /**
  4.      * 模拟 NullPointerException
  5.      * @return
  6.      */
  7.     @RequestMapping("/show1")
  8.     public String showInfo(){
  9.         String str = null;
  10.         str.length();
  11.         return "index";
  12.     }
  13.     /**
  14.      * 模拟 ArithmeticException
  15.      * @return
  16.      */
  17.     @RequestMapping("/show2")
  18.     public String showInfo2(){
  19.         int a = 10/0;
  20.         return "index";
  21.     }
  22. }
复制代码

SimpleMappingExceptionResolver处置处罚 

我们还可以通过SimpleMappingExceptionResolver将具体的非常和错误页面指定对应关系,如许就不消每个非常都单独写一个方法了。
  1. @Configuration
  2. public class GlobalException {
  3.     /**
  4.      * 该方法必须要有返回值。返回值类型必须是:
  5.      SimpleMappingExceptionResolver
  6.      */
  7.     @Bean
  8.     public SimpleMappingExceptionResolver
  9.     getSimpleMappingExceptionResolver(){
  10.         SimpleMappingExceptionResolver resolver = new
  11.                 SimpleMappingExceptionResolver();
  12.         Properties mappings = new Properties();
  13.         /**
  14.          * 参数一:异常的类型,注意必须是异常类型的全名
  15.          * 参数二:视图名称
  16.          */
  17.         mappings.put("java.lang.ArithmeticException", "error1");
  18.         mappings.put("java.lang.NullPointerException","error2");
  19.         //设置异常与视图映射信息的
  20.         resolver.setExceptionMappings(mappings);
  21.         return resolver;
  22.     }
  23. }
复制代码
自定义HandlerExceptionResolver处置处罚

末了我们还可以通过实现HandlerExceptionResolver 接口来根据不同非常类型来动态处置处罚非常。
  1. @Configuration
  2. public class GlobalException implements HandlerExceptionResolver {
  3.     /**
  4.      * @param httpServletRequest
  5.      * @param httpServletResponse
  6.      * @param o
  7.      * @param e
  8.      * @return
  9.      */
  10.     @Override
  11.     public ModelAndView resolveException(HttpServletRequest httpServletRequest
  12.             , HttpServletResponse httpServletResponse
  13.             , Object o, Exception ex) {
  14.         ModelAndView mv = new ModelAndView();
  15.         //判断不同异常类型,做不同视图跳转
  16.         if (ex instanceof ArithmeticException) {
  17.             mv.setViewName("error1");
  18.         }
  19.         if (ex instanceof NullPointerException) {
  20.             mv.setViewName("error2");
  21.         }
  22.         mv.addObject("error", ex.toString());
  23.         return mv;
  24.     }
  25. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表