Spring Integration Java DSL和Http.outboundGateway:如何获取真正的错误消息JSON

时间:2018-11-21 11:00:45

标签: spring-integration spring-integration-dsl

Http.outboundGateway调用失败时如何获取真实的错误消息JSON。

例如,我的程序执行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 :(得分:1)

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的{​​{1}},然后您会{ {1}}以及响应中所有必需的信息。