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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值