1

Spring Integration を使用して Restful API を開発していますが、サービスの 1 つから例外が発生したときにメッセージを取得できません。

これは私のアプリコンテキストです:

<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 public class 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;
}

}

アイデアは、トランスフォーマーにステータスエラーコードを割り当ててユーザーに通知することですが、デバッグモードでリターンステートメントに到達したことを確認できますが、情報がクライアントに到達することはありません...

ここで何が問題になる可能性がありますか?

ありがとう!

4

1 に答える 1

1

問題は、failedMessage. ゲートウェイは、errorMessage の replyChannel ヘッダーで応答を待っています。

単純に errorMessage を使用するか、failedMessage の他のヘッダーが必要な場合はcopyHeaders(errorMessage.getHeaders()).copyHeadersIfAbsent(failedMessge.getHeaders()).

これにより、正しい replyChannel が保持されます。

3.0 (現在はマイルストーン 2) では、このかなり一般的な間違い (応答が機能していない応答チャネルに送信される) を報告するための拡張診断を追加しました。

于 2013-06-24T22:26:26.847 に答える