7-4 SpringCloud快速开发入门:Zuul 的异常处理

接上一章节使用Zuul 的路由规则,这里讲讲Zuul 的异常处理

Zuul 的异常处理

  • Zuul 请求的生命周期图
    在这里插入图片描述

1.正常情况下所有的请求都是按照 pre、route、post 的顺序来执行,然后由 post返回 response
2.在 pre 阶段,如果有自定义的过滤器则执行自定义的过滤器
3.pre、routing、post 的任意一个阶段如果抛异常了,则执行 error 过滤器

我们可以有两种方式统一处理异常:
1、禁用 zuul 默认的异常处理 SendErrorFilter 过滤器,自定义我们自己的Errorfilter 过滤器

#禁用zuul默认的错误过滤器
zuul.SendErrorFilter.error.disable=true
  • 自定义我们自己的Errorfilter 过滤器
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Component

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 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() throws ZuulException {
        try {
            RequestContext context = RequestContext.getCurrentContext();
            ZuulException exception = (ZuulException) 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;
    }
}

在这里插入图片描述

  • 构造异常进行测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、自定义全局 error 错误页面

@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 exception.nStatusCode + "--" + exception.getMessage(); 
 } 
} 

在这里插入图片描述

  • 注释掉zuul默认的错误过滤器方式,已经错误过滤器的类

在这里插入图片描述
在这里插入图片描述

  • 进行测试

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值