美文网首页工作生活
zuul 自定义异常处理

zuul 自定义异常处理

作者: mml_慢慢来 | 来源:发表于2019-07-02 16:22 被阅读0次

    两种方式
    1.自定义error错误页面

    /**
     * 自定义error错误页面
     * @author zhiguang
     */
    @RestController
    public class ErrorHandlerController implements ErrorController {
     
        /**
         * 出异常后进入该方法,交由下面的方法处理
         */
        @Override
        public String getErrorPath() {
            return "/error";
        }
     
        @RequestMapping("/error")
        public Object error(){
            RequestContext ctx = RequestContext.getCurrentContext();
            ZuulException exception = (ZuulException)ctx.getThrowable();
            return Result.choose(exception.nStatusCode, exception.getMessage());
        }
     
    }
    

    我这里是返回的json信息

    2.禁用zuul默认的异常处理filter---SendErrorFilter
    在yml中设置
    zuul:
    SendErrorFilter:
    error:
    disable:true
    然后自定义errorfilter

    public class ErrorFilter extends ZuulFilter {
     
        private static final Logger logger = LoggerFactory.getLogger(ErrorFilter.class);
     
        @Override
        public String filterType() {
            return "error";
        }
     
        @Override
        public int filterOrder() {
            return 0;
        }
     
        @Override
        public boolean shouldFilter() {
            return true;
        }
     
        @Override
        public Object run() throws ZuulException {
            try {
                RequestContext context = RequestContext.getCurrentContext();
                ZuulException exception = this.findZuulException(context.getThrowable());
                logger.error("进入系统异常拦截", exception);
     
                HttpServletResponse response = context.getResponse();
                response.setContentType("application/json; charset=utf8");
                response.setStatus(exception.nStatusCode);
                PrintWriter writer = null;
                try {
                    writer = response.getWriter();
                    writer.print("{code:"+ exception.nStatusCode +",message:\""+ exception.getMessage() +"\"}");
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if(writer!=null){
                        writer.close();
                    }
                }
     
            } catch (Exception var5) {
                ReflectionUtils.rethrowRuntimeException(var5);
            }
     
            return null;
        }
     
        ZuulException findZuulException(Throwable throwable) {
            if (ZuulRuntimeException.class.isInstance(throwable.getCause())) {
                return (ZuulException)throwable.getCause().getCause();
            } else if (ZuulException.class.isInstance(throwable.getCause())) {
                return (ZuulException)throwable.getCause();
            } else {
                return ZuulException.class.isInstance(throwable) ? (ZuulException)throwable : new ZuulException(throwable, 500, (String)null);
            }
        }
    }
    

    可以看看SendErrorFilter这个类的源码,这是zuul的默认异常处理类

    今天处理异常发现404不走过滤器

    还是走的errorcontroller

    /**
     * 自定义error错误页面
     * @author zhiguang
     */
    @RestController
    public class ErrorHandlerController implements ErrorController {
     
        /**
         * 出异常后进入该方法,交由下面的方法处理
         */
        @Override
        public String getErrorPath() {
            return "/error";
        }
     
        @RequestMapping("/error")
        public Object error(HttpServletRequest request, HttpServletResponse response){
            //
            /*RequestContext ctx = RequestContext.getCurrentContext();
            ZuulException exception = (ZuulException)ctx.getThrowable();
            return Result.choose(exception.nStatusCode, exception.getMessage());*/
            Integer status = (Integer)request.getAttribute("javax.servlet.error.status_code");
            return Result.choose(status, status == 404 ? "访问地址不存在" : "内部服务器错误,正在处理");
        }
     
    }
    

    可以查看BasicErrorController;类的源码

    相关文章

      网友评论

        本文标题:zuul 自定义异常处理

        本文链接:https://www.haomeiwen.com/subject/hkhthctx.html