自定义Zuul异常

我在Zuul中有一个场景,其中URL路由的服务也可能关闭。因此,响应主体在JSON主体响应中抛出500 HTTP Status和ZuulException。

{

"timestamp": 1459973637928,

"status": 500,

"error": "Internal Server Error",

"exception": "com.netflix.zuul.exception.ZuulException",

"message": "Forwarding error"

}

我要做的就是自定义或删除JSON响应,并可能更改HTTP状态代码。

我试图用@ControllerAdvice创建一个异常处理程序,但是处理程序未捕获该异常。

因此,我扩展了Zuul筛选器,可以看到在执行错误后它进入了run方法,然后我该如何更改响应。以下是我到目前为止所得到的。我在某处读到了有关SendErrorFilter的内容,但如何实现它以及它的作用是什么?

public class CustomFilter extends ZuulFilter {

@Override

public String filterType() {

return "post";

}

@Override

public int filterOrder() {

return 1;

}

@Override

public boolean shouldFilter() {

return true;

}

@Override

public Object run() {

final RequestContext ctx = RequestContext.getCurrentContext();

final HttpServletResponse response = ctx.getResponse();

if (HttpStatus.INTERNAL_SERVER_ERROR.value() == ctx.getResponse().getStatus()) {

try {

response.sendError(404, "Error Error"); //trying to change the response will need to throw a JSON body.

} catch (final IOException e) {

e.printStackTrace();

} ;

}

return null;

}

将此添加到具有@EnableZuulProxy的类中

@Bean

public CustomFilter customFilter() {

return new CustomFilter();

}

回答:

我们终于完成了这项工作[由我的一位同事编码]:-

public class CustomErrorFilter extends ZuulFilter {

private static final Logger LOG = LoggerFactory.getLogger(CustomErrorFilter.class);

@Override

public String filterType() {

return "post";

}

@Override

public int filterOrder() {

return -1; // Needs to run before SendErrorFilter which has filterOrder == 0

}

@Override

public boolean shouldFilter() {

// only forward to errorPath if it hasn't been forwarded to already

return RequestContext.getCurrentContext().containsKey("error.status_code");

}

@Override

public Object run() {

try {

RequestContext ctx = RequestContext.getCurrentContext();

Object e = ctx.get("error.exception");

if (e != null && e instanceof ZuulException) {

ZuulException zuulException = (ZuulException)e;

LOG.error("Zuul failure detected: " + zuulException.getMessage(), zuulException);

// Remove error code to prevent further error handling in follow up filters

ctx.remove("error.status_code");

// Populate context with new response values

ctx.setResponseBody(“Overriding Zuul Exception Body”);

ctx.getResponse().setContentType("application/json");

ctx.setResponseStatusCode(500); //Can set any error code as excepted

}

}

catch (Exception ex) {

LOG.error("Exception filtering in custom error filter", ex);

ReflectionUtils.rethrowRuntimeException(ex);

}

return null;

}

}

以上是 自定义Zuul异常 的全部内容, 来源链接: utcz.com/qa/398252.html

回到顶部