【问题标题】:Retrieving message in Spring Integration from Service Exception从服务异常中检索 Spring Integration 中的消息
【发布时间】:2013-06-24 21:38:11
【问题描述】:

我正在使用 Spring Integration 开发一个 Restful API,当我的一项服务引发异常时,我无法检索消息。

这是我的应用上下文:

<int-http:inbound-gateway   id="v1.getEvent.inbound.gateway"
                            path="/ptgapi/{apiVersion}/clients/{clientId}/events/{eventId}"
                            supported-methods="GET"
                            request-channel="v1.getEvent.channel.input"
                            reply-channel="v1.getEvent.channel.output"
                            error-channel="v1.getEvent.channel.error"
                            convert-exceptions="true"
                            mapped-request-headers="HTTP_REQUEST_HEADERS,X-ptg-client-token,X-ptg-user-id,X-ptg-user-token,X-ptg-channel"
                            request-timeout="50000"
                            reply-timeout="50000">

    <int-http:header name="apiVersion" expression="#pathVariables.apiVersion"/>
    <int-http:header name="clientId" expression="#pathVariables.clientId"/>
    <int-http:header name="eventId" expression="#pathVariables.eventId"/>

</int-http:inbound-gateway>

<int:chain input-channel="v1.getEvent.channel.input" output-channel="v1.getEvent.channel.output" send-timeout="50000">

    <int:header-enricher>
        <int:error-channel ref="v1.getEvent.channel.error" />
    </int:header-enricher>

    <int:service-activator ref="v1.validation.service" method="validateRequest"/>
    <int:service-activator ref="v1.getEvent.service" method="getEvent"/>    
    <int:object-to-json-transformer/>

</int:chain>

<int:chain input-channel="v1.getEvent.channel.error" output-channel="v1.getEvent.channel.output">
    <int:transformer ref="errorUnwrapper" method="manageError" />
</int:chain>

我的 errorUnwrapper 转换器是:

@MessageEndpoint 公共类 ErrorUnwrapper {

@Transformer
public Message<?> manageError(Message<?> errorMessage) {

    Message<?> failedMessage = ((MessagingException) errorMessage.getPayload())
                                .getFailedMessage();

    Message<?> messageOut = MessageBuilder
                                .withPayload("")
                                .copyHeadersIfAbsent(failedMessage.getHeaders())
                                .setHeaderIfAbsent(HttpHeaders.STATUS_CODE, HttpStatus.ALREADY_REPORTED)
                                .build();
    return failedMessage;
}

}

这个想法是在转换器中分配状态错误代码以通知用户,但信息永远不会到达客户端,尽管我可以确认在调试模式下到达返回语句......

这可能是什么问题?

谢谢!

【问题讨论】:

    标签: java spring http rest spring-integration


    【解决方案1】:

    问题是您正在从failedMessage 回复已失效的replyChannel 标头;网关正在等待errorMessage 中replyChannel 标头的回复。

    您可以简单地使用 errorMessage,或者,如果您需要来自 failedMessage 的其他标头,请使用 copyHeaders(errorMessage.getHeaders()).copyHeadersIfAbsent(failedMessge.getHeaders())

    这将保留正确的回复频道。

    在 3.0(目前处于里程碑 2)中,我们添加了增强的诊断功能来报告这个相当常见的错误(回复被发送到已失效的回复频道)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      相关资源
      最近更新 更多