为了实现全局异常拦截器,我们需要以下步骤:
1.创建全局异常处理类
我们需要创建一个全局异常处理类来捕获控制器中抛出的异常。假设我们的类名为 GlobalExceptionHandler。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", ex);
return mv;
}
}
注意:@ControllerAdvice注解是必须的,用于表示这是一个全局异常处理类。
在上面的代码中,我们使用了 @ExceptionHandler 注解来指定我们要捕获的异常类型,这里指定的是 Exception 类型,也就是说我们将捕获所有异常。
捕获到异常之后,我们需要返回一个 ModelAndView 对象,用于指定要跳转的视图,并且将异常对象存储在 ModelAndView 对象里面,以便于在视图中展示异常信息。
2.编写错误页面
我们需要在视图中编写一个错误页面,并且在 GlobalExceptionHandler 类中指定要跳转的视图名称。
假设我们要跳转到一个名为 error.jsp 的视图,那么代码如下:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception ex) {
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", ex);
return mv;
}
}
上面的代码中,我们调用 ModelAndView 的构造方法,传入了一个视图名称 error。同时,我们还向 ModelAndView 对象中添加了一个名为 exception 的属性,属性值为捕获到的异常。
3.配置 springmvc-dispatcher-servlet.xml 文件
我们需要在 springmvc-dispatcher-servlet.xml 文件中配置一些内容,指定 GlobalExceptionHandler 类的位置和视图解析器的位置。
<mvc:annotation-driven />
<context:component-scan base-package="com.example" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
上面的代码中,我们启用了注解驱动开发,在 component-scan 标签的 base-package 属性中指定了扫描的包名。同时,我们还为视图解析器设置了前缀和后缀。
至此,我们已经成功地完成了全局异常拦截器的编写工作。现在,我们来看两个例子,以更好地理解以上概念。
例子一
在控制器中故意抛出一个异常,然后查看结果:
@RequestMapping(value = "/error", method = RequestMethod.GET)
public void error() throws Exception {
throw new Exception("发生错误");
}
上述代码在 /error 的地址中,手动抛出了一个 Exception 异常,消息为“发生错误”。
当我们访问该地址时,Web 层会自动调用 GlobalExceptionHandler 类中的 handleException 方法,返回磁盘上的 error.jsp 视图文件,同时将错误信息传递给该文件。我们可以在这个页面中展示异常信息。
例子二
有时异常仅限于特定的控制器,我们可以通过使用更具体的异常来定义不同的异常处理函数。例如,如果我们想捕获 RuntimeException 类型的异常并显示一个自定义信息,我们可以创建另一个处理方法:
public class UserController {
@RequestMapping(value = "/adduser", method = RequestMethod.POST)
@ResponseBody
public String addUser(User user) {
int result = userService.addUser(user);
if (result == 1) {
return "success";
} else {
throw new RuntimeException("用户添加失败");
}
}
@ExceptionHandler(RuntimeException.class)
public ModelAndView handleRuntimeException(RuntimeException ex) {
ModelAndView mv = new ModelAndView("error");
mv.addObject("exception", ex);
mv.addObject("message", "用户添加失败");
return mv;
}
}
在上述代码中,我们指定了异常处理方法 handleRuntimeException,捕获 RuntimeException 类型的异常,并返回标准的错误视图 error.jsp。在视图中,我们使用 expression language (EL) 来显示自定义的消息。
这就是手写全局异常处理器的完整攻略,包含了创建全局异常处理类、编写错误页面以及配置 springmvc-dispatcher-servlet.xml 文件等过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在spring中手写全局异常拦截器 - Python技术站