Spring Integration Java DSL и Http.outboundGateway: как получить реальное сообщение об ошибке JSON - PullRequest
0 голосов
/ 21 ноября 2018

Как получить реальное сообщение об ошибке JSON при сбое вызова Http.outboundGateway.

Например, моя программа выполняет HTTP POST.Операция завершается с ошибкой с кодом ошибки 400 Bad Request, и настоящее сообщение об ошибке (проверяется почтальоном):

{
  "name": [
    "This field is needed."
  ]
}

У меня есть такой канал ошибки:

    @Bean
    private IntegrationFlow myErrorChannel() {
      return f -> f.handle("myErrorHandler", "handle")
      ....
      ;
    }

иКласс MyErrorHandler выглядит следующим образом:

@Service
public class MyErrorHandler {
   @ServiceActivator
   public Message<MessageHandlingException> handle(Message<MessageHandlingException> message) {
      ...
   }

}

Содержит ли MessageHandlingException реальное сообщение об ошибке?

    {
      "name": [
          "This field is needed."
      ]
    }

Я отладил код ипроверил исключение MessageHandlingException и, похоже, оно не содержит реального сообщения об ошибке.DetailMessage содержит текст 400 Bad Request, но я хочу знать реальное сообщение об ошибке.

Как получить реальное сообщение об ошибке?

Редактировать:

Это работает(Я назначаю реальное сообщение об ошибке новой полезной нагрузке):

        final RestClientResponseException clientException = (RestClientResponseException) messagingHandlingException.getCause();
        payload = clientException.getResponseBodyAsString();

1 Ответ

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

Resttemplate использует DefaultResponseErrorHandler по умолчанию.Эта логика имеет вид:

protected void handleError(ClientHttpResponse response, HttpStatus statusCode) throws IOException {
    String statusText = response.getStatusText();
    HttpHeaders headers = response.getHeaders();
    byte[] body = getResponseBody(response);
    Charset charset = getCharset(response);
    switch (statusCode.series()) {
        case CLIENT_ERROR:
            throw HttpClientErrorException.create(statusCode, statusText, headers, body, charset);
        case SERVER_ERROR:
            throw HttpServerErrorException.create(statusCode, statusText, headers, body, charset);
        default:
            throw new UnknownHttpStatusCodeException(statusCode.value(), statusText, headers, body, charset);
    }
}

Исключение отсюда выбрасывается в HttpRequestExecutingMessageHandler, который действительно оборачивает его в MessageHandlingException.

Поскольку вы говорите, что можете справитьсяпоследний через ваш MyErrorHandler, я бы посоветовал вам просто взглянуть на cause из MessageHandlingException, и вы получите RestClientResponseException со всей необходимой информацией из ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...