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