Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Customizing Zuul Exception

Tags:

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(); } 
like image 335
Grinish Nepal Avatar asked Apr 06 '16 20:04

Grinish Nepal


People also ask

How configure Zuul API gateway?

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.

What are the different kinds of filters provided by Zuul?

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.


1 Answers

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;     } } 
like image 180
Grinish Nepal Avatar answered Sep 22 '22 06:09

Grinish Nepal