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

Spring Integration Java DSL and Http.outboundGateway: How to get the real error message JSON

如何在Http.outboundGateway调用失败时得到真正的错误信息JSON。

例如我的程序执行 HTTP POST。操作失败,错误代码为 400 Bad Request,真正的错误消息是(使用 Postman 测试):

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

我有这样的错误通道:

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

而 Class 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();

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处理最后一个,我建议你只看一下MessageHandlingExceptioncause,你会RestClientResponseException 包含响应中的所有必需信息。