springcloud zuul实践:自定义异常过滤器,统一异常响应格式

在springcloud项目中,网关发生异常时,响应内容并不是我们想要的格式,内容如下:

{
  "timestamp": 1481674980376,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "java.lang.RuntimeException",
  "message": "Exist some errors..."
}

上面的json则是内置异常过滤器封装的一种格式。我们现在想要修改她,就需要自定义异常过滤器。

  • 首先继承抽象类ZuulFilter,实现filterType()filterOrder()shouldFilter()run()四个抽象方法。前三个方法均使用父方法逻辑。仅修改run()中部分内容,主体逻辑步骤依然参考SendErrorFilter
  • 方法run()中重新定义异常响应格式,将自定义的响应体,设置到原有的响应中。
  • 停用内置的默认异常处理器SendErrorFilter,在application.yml中设置zuul.SendErrorFilter.error.disable: true
  • CustomSendErrorFilter在内置的默认异常处理器失效时生效。设置注解ConditionalOnProperty属性name="zuul.SendErrorFilter.error.disable"

过滤器详细介绍可参考往期文章:springcloud zuul源码分析:内置过滤器

下面是案例代码:

@Component
@ConditionalOnProperty(name="zuul.SendErrorFilter.error.disable")
public class CustomSendErrorFilter extends SendErrorFilter {
    @Override
    public String filterType() {
        return super.filterType();
    }

    @Override
    public int filterOrder() {
        return super.filterOrder();
    }

    @Override
    public boolean shouldFilter() {
        return super.shouldFilter();
    }

    @Override
    public Object run() {

        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletResponse response = ctx.getResponse();
        try {
            int responseStatusCode = ctx.getResponseStatusCode();
            // 此处自定义响应体start
            String cumstomBody = "{}";//内容省略...
  			// 此处自定义响应体end
            response.setStatus(ctx.getResponseStatusCode());
            response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
            response.getOutputStream().write(cumstomBody.getBytes());
        } catch (IOException e) {
            ReflectionUtils.rethrowRuntimeException(e);
        } finally {
            ThreadLocalUtil.remove();
        }
        return null;
    }
}

你可能感兴趣的:(springcloud)