I have a scenario in Zuul where the service that the URL is routed too might be down . So the reponse body gets thrown with 500 HTTP Status and ZuulException in the JSON body response.
{ "timestamp": 1459973637928, "status": 500, "error": "Internal Server Error", "exception": "com.netflix.zuul.exception.ZuulException", "message": "Forwarding error" }
All I want to do is to customise or remove the JSON response and maybe change the HTTP status Code.
I tried to create a exception Handler with @ControllerAdvice but the exception is not grabbed by the handler.
UPDATES:
So I extended the Zuul Filter I can see it getting into the run method after the error has been executed how do i change the response then. Below is what i got so far. I read somewhere about SendErrorFilter but how do i implement that and what does it do?
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; }
Added this to the class that has @EnableZuulProxy
@Bean public CustomFilter customFilter() { return new CustomFilter(); }
Setting up Zuul API Gateway Server There are three steps to set up the Zuul API Gateway: Create a component for the Zuul API Gateway. Decide the things that the Zuul API Gateway should do. All the important requests are configured to pass through the Zuul API Gateway.
There are four types of standard filters in Zuul: pre for pre-routing filtering, route for routing to an origin, post for post-routing filters, and error for error handling. Zuul also supports a static type for static responses.
We finally got this working [Coded by one of my colleague]:-
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; } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With