在项目中,我们不可否认的会出现异常,而且这些异常并没有进行捕获。经常出现的bug如空指针异常等等。
基于注解的异常映射
一、
①在自动扫描的包的范围内声明一个类,此类用@ControllerAdvice注解标记 ,在该类中声明一个标记了@ExceptionHandler注解的方法
@ControllerAdvice public class GlobalExceptionMapping { @ExceptionHandler(value=Exception.class) public ModelAndView globalExceptionMapping(Exception exception) { ModelAndView modelAndView = new ModelAndView("global-error"); modelAndView.addObject("globalException", exception); return modelAndView; } }
②错误页面
<body> <h1>Global Error</h1> 指定属性名的错误消息:${requestScope.globalException }<br/> </body>
二、
①新建GlobalExceptionResover实现HandlerExceptionResolver
/** * 全局异常捕获 * @author XXX * */ public class GlobalExceptionResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { //-------------------------------------------- return null; } }
public class ExceptionResolver implements HandlerExceptionResolver { private Log LOG = LogFactory.getLog(ExceptionResolver.class); @Autowired private ObjectMapperProvider objectMapperProvider; @ResponseBody @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) { String result = ""; BaseResponse respModel = new BaseResponse(); try { if (ex instanceof ResponseErrorException) { respModel.setReturn_code(((ResponseErrorException) ex).getCode()); respModel.setReturn_message(ex.getMessage()); } else { LOG.error("#请求处理异常:", ex); if (ex instanceof com.fasterxml.jackson.databind.JsonMappingException) { respModel.setReturn_code("-1"); respModel.setReturn_message("JSON转换异常!"); } else if (ex instanceof com.alibaba.dubbo.remoting.TimeoutException) { respModel.setReturn_code("-1"); respModel.setReturn_message("调用后台服务时超时!"); } else { respModel.setStatus("FAIL"); respModel.setReturn_code("-1"); respModel.setReturn_message("请求处理异常:".concat(ExceptionUtils.getMessage(ex))); } respModel.setReturn_code(SystemReturnCodeEnum.SYSTEM_ERROR.getCode()); respModel.setReturn_message("请求处理异常:".concat(ExceptionHelper.getExceptionMessage(ex))); } result = objectMapperProvider.getObjectMapper().writeValueAsString(respModel); response.setCharacterEncoding("UTF-8"); response.setContentType("text/json;charset=UTF-8"); response.getWriter().write(result); response.setStatus(HttpStatus.SC_OK);//200 } catch (Exception e) { LOG.error("全局异常!", e); } ModelAndView mav = new ModelAndView(); return mav; }
②在Spring配置文件中配置刚才新建的类
<!--全局异常捕捉 --> <bean class="com.ssm.exception.GlobalExceptionResolver" />
基于XML的异常映射
①配置SimpleMappingExceptionResolver,在excceptionMappings属性中指定映射关系
<bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.BizException">global-error</prop> global-error 视图名称会去拼前后缀 <prop key="java.lang.LogInException">logIn-error</prop> logIn-error 视图名称会去拼前后缀 </props> </property> </bean>
②错误页面
<body> <h1>Global Error</h1> 系统默认的异常对象属性名:${requestScope.exception } </body>一般异常映射用XML即可,便于统一的管理,基于注解的全局映射好处:可以写java代码,可以将异常信息保存到文件或数据库中