【发布时间】:2019-02-22 01:08:00
【问题描述】:
我正在尝试抑制从 http 出站网关为非 2XX 状态代码生成的 MessageHandlingException,并优雅地将控制权返回给父流,以便在成功流中按照预期在回复通道上返回带有原始有效负载的消息。
原代码:
@Bean
public IntegrationFlow inquiry() {
return flow -> flow
.handle(Http
.outboundGateway("url", restTemplate)
.mappedRequestHeaders("*")
.headerMapper(headerMapper)
.extractPayload(true)
.httpMethod(HttpMethod.POST)
.expectedResponseType(expectedResponseType.class)
)
我尝试在 Http 上使用 errorHandler,但它提供了客户端响应的句柄,并且原始有效负载不是其中的一部分。
也尝试过 Expression Advice 路线。
@Bean
public IntegrationFlow inquiry() {
return flow -> flow
.handle(Http
.outboundGateway("url", restTemplate)
.mappedRequestHeaders("*")
.headerMapper(headerMapper)
.extractPayload(true)
.httpMethod(HttpMethod.POST)
.expectedResponseType(expectedResponseType.class)
, c->c.advice(expresionAdvice()))
如果没有成功和失败通道,建议不会返回控制权,而是将控制权返回给父级。
可能最简单的方法是用try.. catch 包装.handle 并捕获MessageHandlingException 并将其传播到@ExceptionHandler 并对其进行转换。
有没有办法使用建议或 errorChannel 来完成,在 @MessagingGateway 上尝试了 errorChannel,它在来自 http 出站网关的 404 之后没有被调用。
上面的代码是另一个流程的一部分,我正在独立测试这个流程。
IntegrationFlow 上会不会有错误通道?
更新 1:
能够弄清楚为什么 @MessagingGateway 上的 errorChannel 没有从测试中被调用,它仅在调用完整流时才被调用,而不是仅在使用 DirectChannel 的 inquiry() 方法中被调用。
现在 errorChannel 正在工作,使用异常之前的有效负载状态设置自定义标头,并从 failedMessage 标头中访问它。
它现在按预期工作,并且永远不会向响应中抛出错误。感觉这是一种解决方法..
有没有办法在建议中更好地处理这个问题?
编辑 1:
代码不完整,我试图让它工作
@Bean
public Advice expressionAdvice() {
ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnSuccessExpressionString("payload");
advice.setOnFailureExpressionString("payload");
advice.setTrapException(true);
return advice;
}
由于我没有从建议中指定通道流,因此流无处可去,需要像.defaultOutputToParentFlow() 这样的东西,以便它使用Message 回到父流。
答案:
成功了, 但唯一的问题是,我仍然需要自定义标头来获取原始有效负载,而不是请求失败的有效负载/正文才能继续进程。
@Bean
public Advice expressionAdvice() {
ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setOnSuccessExpressionString("payload");
advice.setOnFailureExpressionString("headers['CUSTOM_KEY']");
advice.setTrapException(true);
advice.setReturnFailureExpressionResult(true);
return advice;
}
这就是我正在寻找的。可能会更改变量名称,因为建议将返回成功,而不仅仅是失败案例。
【问题讨论】:
-
编辑问题以显示您的
expresionAdvice()bean。 -
查看我对该建议的回答
标签: spring-integration spring-integration-dsl spring-integration-http