Как настроить ответ API загрузочного контроллера Spring для ZuulException - PullRequest
0 голосов
/ 12 ноября 2018

Мы используем службы приложений Zuul, Eureka и Spring для API REST.

Предположим, что моя служба весенней загрузки не работает, и когда я пытался получить доступ к API с помощью шлюза Zuul 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 Ответ

0 голосов
/ 13 ноября 2018

Вы можете реализовать свой собственный 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-адрес маршрута, а идентификатор сервиса. return "SERVICEID"

...