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