zuul 自定義異常處理

兩種方式
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;類的源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章