1、异常处理机制
系统的各个地方可能抛出异常,而不同地方抛出的相同异常它们的处理方式也可能是相同的,那么重复的去实现异常处理就太费劲了,因此需要建立一个全局范围的异常处理机制。
2、实现方式
在Spring框架下实现异常处理机制有两种方式,一种是用xml配置的方式,一种是用注解的方式。
i、xml配置
在SpringMVC的配置文件上,加上如下的Bean:
<!-- 配置基于XML的异常机制 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" id="simpleMappingExceptionResolver">
<!-- 配置异常类型和具体视图页面的对应关系 -->
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">system-error</prop>
<prop key="com.alageek.crowd.exception.AccessForbiddenException">admin-login</prop>
</props>
</property>
</bean>
上面已经添加了两个异常处理,一个是自定义异常访问禁止异常,系统捕获到该异常后,将会跳转页面到登录页面admin-login,该异常一般由拦截器抛出;第二个异常处理是Exception异常,该异常对应跳到system-error页面。
ii、注解
全局异常处理需要用到两个注解,一个是@ControllerAdvice,放在类前,表示当前类是基于注解的异常处理类;另一个是@ExceptionHandler,放在方法前,将具体的异常类与方法关联。代码如下:
/**
* 异常处理机制
* @author alageek
* 注解ControllerAdvice表示当前类是基于注解的异常处理器类
*/
@ControllerAdvice
public class CrowdExceptionResolver {
/**
* 禁止访问异常处理
* 注解ExceptionHandler将异常类与方法关联
* @param exception 异常对象
* @param request 请求对象
* @param response 响应对象
* @return 若请求为Ajax请求,则返回json类型的错误信息,否则返回错误页面
* @throws IOException ResultEntity对象转json异常
*/
@ExceptionHandler(value = AccessForbiddenException.class)
public ModelAndView resolveAccessForbiddenException(
AccessForbiddenException exception,
HttpServletRequest request,
HttpServletResponse response) throws IOException {
String viewName = "admin-login";
return commonResolve(exception, request, response, viewName);
}
/**
* 其他失败异常处理
* 注解ExceptionHandler将异常类与方法关联
* @param exception 异常对象
* @param request 请求对象
* @param response 响应对象
* @return 若请求为Ajax请求,则返回json类型的错误信息,否则返回错误页面
* @throws IOException ResultEntity对象转json异常
*/
@ExceptionHandler(value = Exception.class)
public ModelAndView resolveException(
Exception exception,
HttpServletRequest request,
HttpServletResponse response ) throws IOException {
String viewName = "system-error";
return commonResolve(exception, request, response, viewName);
}
private ModelAndView commonResolve(
Exception exception,
HttpServletRequest request,
HttpServletResponse response,
String viewName) throws IOException {
if(CrowdUtil.judgeRequestType(request)){
// Ajax请求
response.getWriter().write(new Gson().toJson(ResultEntity.failed(exception.getMessage())));
return null;
}
// 普通请求
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
modelAndView.setViewName(viewName);
return modelAndView;
}
}
上述代码以访问禁止异常与其他异常为例,由于捕获到异常后的动作都是跳转页面,因此可以将共同操作抽象出来,写成一个方法commonResolve。
以上就是Spring中的全局异常处理机制。