自定义全局异常处理器

public class RtopExceptionHandler implements HandlerExceptionResolver{

    private static final Logger logger = LoggerFactory.getLogger(RtopExceptionHandler.class);

    @Override    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o,                                         Exception ex) {

        //处理buservice的异常        response.setContentType("application/json");        response.setCharacterEncoding("utf-8");

        if(ex instanceof AccessException) {            if(BuserviceConstants.HANDLER_DIGEST_LOGGER.isInfoEnabled()) {                BuserviceConstants.HANDLER_DIGEST_LOGGER.info("The current request failed, the reason:" + ex);            }

            AccessException e = (AccessException)ex;            String redirectUrl = e.getRedirectUrl();            String requestURI = request.getRequestURI();            if(StringUtils.endsWithIgnoreCase(requestURI, ".json")) {                try {                    ErrorCodeEnum errorCode = e.getErrorCode();                    String buserviceErrorCode = errorCode == null? ErrorCodeEnum.UNKNOW.name():errorCode.name();                    String buserviceErrorMsg = errorCode == null? ErrorCodeEnum.UNKNOW.getDescCn():errorCode.getDescCn();

                    RtopHttpResult result = RtopHttpResult.Failure(buserviceErrorCode, buserviceErrorMsg);

                    if(ErrorCodeEnum.USER_NOT_LOGIN == errorCode){                        //如果返回的错误是用户未登录,则将请求强制改为success,为了防止前端弹框展示错误信息.由前端直接跳转到登录页面.                        result.setSuccess(true);                    }

                    PrintWriter pw = response.getWriter();                    String callback = request.getParameter("callback");                    if(StringUtil.isNotBlank(callback)) {                        pw.print(callback + "(" + JSON.toJSONString(result) + ")");                    } else {                        pw.print(JSON.toJSON(result));                    }

                    pw.close();                } catch (Exception var13) {                    BuserviceConstants.HANDLER_DIGEST_LOGGER.info("The current JSON request fails, intercepting failure:" + var13);                }

            } else {                return StringUtil.isNotBlank(redirectUrl)?this.returnPage("redirect:" + redirectUrl, ex, new ModelAndView()):this.returnPage("/error", ex, new ModelAndView());

            }        }else if(ex instanceof ErrorCodeException){            ErrorCodeException errorCodeException = (ErrorCodeException) ex;            LoggerUtil.error(errorCodeException, "");

            String errorCode = errorCodeException.getErrorCode().getCode();            String errorMsg = errorCodeException.getErrorCode().getMessage();            RtopHttpResult result = RtopHttpResult.Failure(errorCode, errorMsg);

            try{                PrintWriter pw = response.getWriter();                pw.print(JSON.toJSON(result));                pw.close();            }catch (Exception e) {                LoggerUtil.info(logger, "response in RtopExceptionHandler error" + e.getMessage());            }

        }else if(ex instanceof RuntimeException){            if(ex instanceof  IllegalStateException){                return null;            }            LoggerUtil.error(ex, "");

            RtopHttpResult result = RtopHttpResult.Failure(RtopAppErrorCode.INTERNAL_ERROR);

            try{                PrintWriter pw = response.getWriter();                pw.print(JSON.toJSON(result));                pw.close();            }catch (Exception e) {                LoggerUtil.info(logger, "response in RtopExceptionHandler error" + e.getMessage());            }

        }

        return null;    }

    public ModelAndView returnPage(String page, Exception ex, ModelAndView view) {        view.addObject("exception", ex);        view.setViewName(page);        return view;    }}

原文地址:https://www.cnblogs.com/wwqwwq/p/10919674.html

时间: 2024-11-02 04:49:34

自定义全局异常处理器的相关文章

【spring】-- springboot配置全局异常处理器

一.为什么要使用全局异常处理器? 什么是全局异常处理器? 就是把错误异常统一处理的方法. 应用场景: 1.当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句直接捕获,这时可以使用全局异常处理器来捕捉该异常. 2.当你自定义了一个异常类,可以在全局异常处理器中来捕捉该异常.(当然也可以直接在抛出异常处直接捕获,但是这样需要在每一个抛出的地方都写一次捕获代码,看起来不够美观且复用性不强,其他异常同理). 所有异常都可以在全局异常处理器中捕获进行统一处理 二

springmvc中拦截器与springmvc全局异常处理器的问题

最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 中抛出了系统自定义异常, 当时有有个疑惑, 就是抛出的这个异常全局异常处理器怎么处理的. 这里的全局异常处理器时通过实现HandlerExceptionResolver这个借口实现的 要指出的是 resolveException方法 中 handler中代表的是什么,我没遇到这个问题之前我认为这玩

Spring Boot 中全局异常处理器

Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloController类 修改HelloController,使得访问/hello一定会产生异常: some exception package cn.xdf.springboot.web; import java.text.DateFormat; import java.util.Date; import

自定义全局异常捕获

原文:http://blog.csdn.net/jinzhencs/article/details/51700009 第一种:实现HandlerExceptionResolver 注意: 把错误码 重设成200,不然还是返回的异常信息. 注解@Compoment交由spring创建bean 之后就能愉快的返回自己的错误码了. 或者记录错误日志. /** * 全局异常捕获 * @author Mingchenchen * */ @Component public class GlobleExcep

SpringMVC学习(八)——SpringMVC中的异常处理器

SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 异常处理思路 我们知道,系统中异常包括两类:预期异常和运行时异常(RuntimeException),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.系统的dao.service.controller出现异常都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,SpringMV

自定义springmvc统一异常处理器(实现HandlerExceptionResolver接口)不起作用的一种情况

ExceptionResolverCustom 这个是自定义的异常处理器类. 在springmvc中注册 在web.xml文件中屏蔽springmvc自动注册的异常处理器 网上的资料就是这么配置的,可自己配置的异常处理器就是不起作用 看下springmvc是如何加载自定义的异常处理器的 可以看到,springmvc从容器中取自定义异常处理器时是通过指定的id去取的, 所以说在springmvc中配置自定义处理器的时候id注意下不要写错,这个id是 handlerExceptionResolver

Spring MVC全局异常后返回JSON异常数据

Spring MVC全局异常后返回JSON异常数据 问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内容,如果是404请求不到资源或者500这类服务器的问题,可能会导致返回404和500异常页面,手机端的处理就非常麻烦,为了解决这个问题,就需要做全局的异常处理. 解决方案: (1)自定义或者使用spring自带的各种异常处理器 例如spring基于

springmvc 全局异常解决方案

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao.service.controller出现都通过throwsException向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图: 1.自定义异常类: package cn.itcast.ssm.exception; public class CustomerException exten

springmvc学习笔记(16)-异常处理器

springmvc学习笔记(16)-异常处理器 springmvc学习笔记16-异常处理器 异常处理思路 自定义异常类 全局异常处理器 错误页面 在springmvcxml配置全局异常处理器 异常测试 本文主要介绍springmvc中异常处理的思路,并展示如何自定义异常处理类以及全局异常处理器的配置 异常处理思路 系统中异常包括两类: 预期异常 运行时异常RuntimeException 前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao