代码之家  ›  专栏  ›  技术社区  ›  Krish

如何为zuulexception定制Spring引导控制器API响应

  •  0
  • Krish  · 技术社区  · 6 年前

    我们正在为RESTAPI使用zuul、eureka和Spring引导应用程序服务。

    假设我的Spring引导服务已关闭,当我尝试使用zuul api网关访问api时,我得到zuulexception,响应如下:

    {
        "timestamp": "2018-10-12T14:29:09.632+0000",
        "status": 500,
        "error": "Internal Server Error",
        "exception": "com.netflix.zuul.exception.ZuulException",
        "message": "GENERAL"
    }
    

    我要自定义响应格式,如下所示:

    {
        "success": false,
        "message": "Service is down. Please try later"
    }
    

    我试着执行 https://stackoverflow.com/a/39841785/5506061 但这对我不起作用。

    请建议如何自定义zuulexception的响应。

    1 回复  |  直到 6 年前
        1
  •  0
  •   redoff    6 年前

    如果需要,您可以实现自己的FallbackProvider并根据原因自定义响应。

    比如:

    @Component
    public class CustomFallbackBasedOnCause implements FallbackProvider {
    
    private static final String DEFAULT_MSG = "{\"success\": false,\"message\": \"Service is down. Please try later\"}";
    
    @Override
    public String getRoute() {
        return "*"; // * = all routes
    }
    
    @Override
    public ClientHttpResponse fallbackResponse(final Throwable cause) {
        if (cause instanceof HystrixTimeoutException) {
            return response(HttpStatus.GATEWAY_TIMEOUT);
        } else {
            return fallbackResponse();
        }
    }
    
    @Override
    public ClientHttpResponse fallbackResponse() {
        return response(HttpStatus.INTERNAL_SERVER_ERROR);
    }
    
    private ClientHttpResponse response(final HttpStatus status) {
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return status;
            }
    
            @Override
            public int getRawStatusCode() throws IOException {
                return status.value();
            }
    
            @Override
            public String getStatusText() throws IOException {
                return status.getReasonPhrase();
            }
    
            @Override
            public void close() {
            }
    
            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream(DEFAULT_MSG.getBytes());
            }
    
            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
    }
    

    正如你在 getRoute() 方法,可以指定此CustomFallback是否将用于所有路由( return "*" )或特定路线。

    如果您使用注册表服务(例如Eureka)。您不必指定路由URL,而是指定服务ID。 return "SERVICEID"