ExpressionEvaluatingRequestHandlerAdvice下Http ResponseEntity错误处理异常
问题描述
- 基于Spring Integration错误处理场景延续排查:在
ExpressionEvaluatingRequestHandlerAdvice的failureChannel转换器中,已正确生成包含409状态码和AdapterErrorResponsebody的ResponseEntity<Object> - 按要求通过
MessageBuilder.withPayload(response).copyHeaders(message.getPayload().getFailedMessage().getHeaders()).build()构建消息,且转换器输出通道已配置为入站网关的回复通道,但该ResponseEntity无法作为HTTP响应返回 - 对比场景:后续另一个未使用
ExpressionEvaluatingRequestHandlerAdvice的出站网关,其异常处理生成的同类ResponseEntity可正常返回至入站网关回复通道 - 疑问:使用
ExpressionEvaluatingRequestHandlerAdvice处理响应是否需要额外配置?第一个出站网关是否存在配置遗漏?
排查与解决方案
开启
returnFailureExpressionResult属性ExpressionEvaluatingRequestHandlerAdvice默认returnFailureExpressionResult为false,此时Advice会重新抛出错误而非返回处理后的结果。必须显式设置为true,确保转换器生成的ResponseEntity能作为回复返回:advice.setReturnFailureExpressionResult(true);XML配置方式:
<int:request-handler-advice-chain> <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice"> <property name="returnFailureExpressionResult" value="true"/> <!-- 其他配置:failureChannel、failureExpression等 --> </bean> </int:request-handler-advice-chain>校验
replyChannel头的有效性
虽然已复制失败消息的头,但需确认replyChannel头确实指向入站网关的回复通道。可在转换器中打印message.getPayload().getFailedMessage().getHeaders().getReplyChannel()的值,验证其与入站网关的回复通道实例一致。若头信息异常,可手动指定:MessageBuilder.withPayload(response) .setHeader(MessageHeaders.REPLY_CHANNEL, inboundGatewayReplyChannel) .copyHeaders(message.getPayload().getFailedMessage().getHeaders()) .build();检查
failureChannel的消息流转
确认failureChannel上的转换器无额外过滤/拦截逻辑导致ResponseEntity消息被丢弃或修改。可在转换器输出通道末端添加日志拦截器,验证消息是否成功发送至目标回复通道。对比两个出站网关的配置差异
仔细核对两类网关的配置细节:- 是否均开启了回复处理逻辑
- 入站网关的回复通道是否为全局可访问的Bean
- 第一个网关的Advice是否覆盖了默认错误处理逻辑,导致回复通道未正确绑定
内容的提问来源于stack exchange,提问作者KeepItSimple
相关产品推荐
相关产品推荐

