如何处理http出站网关中的异常? 当我收到状态代码500或400 ...时,会显示异常。那么我应该怎么做才能使用spring集成处理http错误。
我的配置如下:
f <- function(x) {
sum(is.na(x)) < length(x) * 0.2
}
df[, vapply(df, f, logical(1)), drop = F]
我想知道为什么异常会转到回复频道
答案 0 :(得分:1)
我想知道为什么异常没有去回复频道
因为处理异常是很自然的,例如,呃,例外。
有(至少)两种方法来处理Spring Integration中的异常。
error-channel
和关联的流。错误通道获得ErrorMessage
有效载荷MessagingException
;该例外有两个属性 - failedMessage
和cause
。ExpressionEvaluatingRequestHandlerAdvice
(或自定义建议);见Adding Behavior to Endpoints。答案 1 :(得分:1)
如果响应状态代码位于HTTP系列 CLIENT_ERROR 或 SERVER_ERROR 中,则会抛出 HttpClientErrorException 或 HttpServerErrorException 分别。因此,响应不会转到回复频道
参考DefaultResponseErrorHandler
方法:hasError和handleError
要处理这些异常,请创建自己的CustomResponseErrorHandler并覆盖hasError和handlerError方法的内容。
public class CustomResponseErrorHandler extends DefaultResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return hasError(getHttpStatusCode(response));
}
protected boolean hasError(HttpStatus statusCode) {
return /*Status Code to be considered as Error*/ ;
}
@Override
public void handleError(ClientHttpResponse response) throws IOException { /* Handle Exceptions */
}
}
将错误处理程序添加到http-outbound-gateway
<int-http:outbound-gateway id="quakerHttpGateway"
request-channel="quakeinfotrigger.channel" url="http://fooo/mmmm/rest/put/44545454"
http-method="PUT" expected-response-type="java.lang.String" charset="UTF-8"
reply-timeout="5000" reply-channel="quakeinfo.channel" error-handler="customResponseErrorHandler">
</int-http:outbound-gateway>
答案 2 :(得分:0)
我也遇到了同样的问题。我抛出了自己的自定义异常和错误消息,但始终收到“ 500 Internal server error”。这是因为在抛出Exception时将没有答复消息并且“答复”超时。因此我处理订阅错误通道,然后由我自己回复即可。
Message<?> failedMessage = exception.getFailedMessage();
Object replyChannel = new MessageHeaderAccessor(failedMessage).getReplyChannel();
if (replyChannel != null) {
((MessageChannel) replyChannel).send(MessageFactory.createDataExchangeFailMessage(exception));
}