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

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

1
2
3
4
5
6
7
{
"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源码分析:内置过滤器

下面是案例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@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;
}
}
继续努力吧!来一个