SpringMVC-异常的映射

在项目中,我们不可否认的会出现异常,而且这些异常并没有进行捕获。经常出现的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代码,可以将异常信息保存到文件或数据库中

猜你喜欢

转载自blog.csdn.net/wxd_1024/article/details/80087664