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();
答案 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}}以及响应中所有必需的信息。