博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC处理异常的三种方式
阅读量:4126 次
发布时间:2019-05-25

本文共 2994 字,大约阅读时间需要 9 分钟。

SpringMVC处理异常的三种方式

使用 @ ExceptionHandler 注解
实现 HandlerExceptionResolver 接口
使用 @controlleradvice 注解

  1. 使用 @ ExceptionHandler 注解
    使用该注解有一个不好的地方就是:进行异常处理的方法必须与出错的方法在同一个Controller里面,可以看到,这种方式最大的缺陷就是不能全局控制异常。每个类都要写一遍。

@Controller

public class UserController {

/**

* 模拟 NullPointerException * @return */@RequestMapping("/show1")public String showInfo(){    String str = null;    str.length();    return "index";}/** * 模拟 ArithmeticException * @return */@RequestMapping("/show2")public String showInfo2(){    int a = 10/0;    return "index";}/** * java.lang.ArithmeticException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */@ExceptionHandler(value={java.lang.ArithmeticException.class})public ModelAndView arithmeticExceptionHandler(Exception e){    ModelAndView mv = new ModelAndView();    mv.addObject("error", e.toString());    mv.setViewName("error1");    return mv;}/** * java.lang.NullPointerException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视 图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */@ExceptionHandler(value={java.lang.NullPointerException.class})public ModelAndView nullPointerExceptionHandler(Exception e){    ModelAndView mv = new ModelAndView();    mv.addObject("error", e.toString());    mv.setViewName("error2");    return mv;}

}

  1. 使用 @controlleradvice 注解+@ExceptionHandler
    上文说到 @ ExceptionHandler 需要进行异常处理的方法必须与出错的方法在同一个Controller里面。那么当代码加入了 @ControllerAdvice,则不需要必须在同一个 controller 中了。这也是 Spring 3.2 带来的新特性。从名字上可以看出大体意思是控制器增强。 也就是说,@controlleradvice + @ ExceptionHandler 也可以实现全局的异常捕捉。
    请确保此WebExceptionHandle 类能被扫描到并装载进 Spring 容器中

@ControllerAdvice

public class GlobalException {

/** * java.lang.ArithmeticException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */@ExceptionHandler(value={java.lang.ArithmeticException.class})public ModelAndView arithmeticExceptionHandler(Exception e){    ModelAndView mv = new ModelAndView();    mv.addObject("error", e.toString()+" -- advice");    mv.setViewName("error1");    return mv;}/** * java.lang.NullPointerException * 该方法需要返回一个 ModelAndView:目的是可以让我们封装异常信息以及视 图的指定 * 参数 Exception e:会将产生异常对象注入到方法中 */@ExceptionHandler(value={java.lang.NullPointerException.class})public ModelAndView nullPointerExceptionHandler(Exception e){    ModelAndView mv = new ModelAndView();    mv.addObject("error", e.toString()+" -- advice");    mv.setViewName("error2");    return mv;}

}

如果 @ExceptionHandler 注解中未声明要处理的异常类型,则默认为参数列表中的异常类型。所以还可以写成这样:

@ControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler()@ResponseBodyString handleException(Exception e){    return "Exception Deal! " + e.getMessage();}

}

控制器中就只有业务处理的代码了

@Component //注意该类需要交给Spring容器管理

public class MyExceptionResolver implements HandlerExceptionResolver {

@Override

  public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj,Exception ex) {
    System.out.println(ex.getMessage());
    ModelAndView mv = new ModelAndView();
    mv.setViewName("/error.jsp");
    return mv;
  }
}

转载地址:http://lehpi.baihongyu.com/

你可能感兴趣的文章
一些很酷的.Net技巧
查看>>
鲍尔默致员工信:部署09年微软5大工作重心
查看>>
使用ScriptManager控件
查看>>
程序员四大忌
查看>>
JavaScript基础知识
查看>>
ScriptManager 以及ScriptManagerProxy Service属性的使用
查看>>
在 ASP.NET AJAX 中使用 Web 服务
查看>>
UpdatePanel的使用注意
查看>>
JavaScript常见问题总结
查看>>
Web实用小工具推荐使用
查看>>
.NET垃圾回收机制详解与心得体会
查看>>
不能不去的jQuery网站
查看>>
品味《编程之美》
查看>>
一维表转换成二维表
查看>>
获取文件目录的两种方法
查看>>
永不言弃
查看>>
"Not associated with a trusted SQL Server connection"解决方法
查看>>
C#修改文件或文件夹名称
查看>>
解决回车刷新页面问题
查看>>
FCKeditor使用说明
查看>>