2016-05-10 4 views
1

私はSpring Integrationプロジェクトの一部としてSpring WSエンドポイントを持っています。私はSoap Headerにアクセスしたいと思います。SoapHeaderをSpring WSエンドポイントに追加

[10/05/16 05:00:05:005 PDT]ローカルホスト-startStop-1 DEBUG springframework.integration.util.MessagingMethodInvokerHelper私は私は次の例外を取得するメソッドパラメータにSoapHeaderはを追加する場合.doWith(): メソッド[public com.bstonetech.ptms.integration.model.ws.external.contract.GetContractRespons com.bstonetech.ptms.integration.service.ws.GetContractEndpoint.getContract(com.bstonetech.ptms。メッセージの処理に適さない 複数のパラメータ型候補が見つかりました: [@ org.springframework.ws.server.endpoint.annotation.RequestPayload com.bstonetech.ptms.integration.model.ws.external.contract.GetContractRequest] および[org.springframework.ws.context.MessageContext]。 [10/05/16 05:00:05:005 PDT]ローカルホスト-startStop-1)( web.context.support.XmlWebApplicationContext.refreshに警告:例外コンテキスト初期化中に遭遇 - キャンセルリフレッシュ試行

ジャワ.lang.IllegalArgumentException:[クラス com.bstonetech.ptms.integration.service.ws.GetContractEndpoint]タイプのターゲットオブジェクトに、 メッセージを処理するための適格なメソッドがありません。

MessageContext messageContextも同じエラーが発生します。

私は明らかに何かが不足しています。どんな助けもありがとう。次のように

の統合は、次のように

<oxm:jaxb2-marshaller id="contractMarshaller" context-path="com.bstonetech.ptms.integration.model.ws.external.contract"/> 
    <ws:inbound-gateway id="getContractWs" request-channel="inboundGetContractChannel" mapped-request-headers="fileId" mapped-reply-headers="fileId" 
         marshaller="contractMarshaller" unmarshaller="contractMarshaller"/> 



    <int:service-activator id="contractEndpoint" input-channel="inboundGetContractChannel" ref="getContractEndpoint"/> 

エンドポイントが見えます:遅延の

@Endpoint 
public class GetContractEndpoint { 

    private static final String NAMESPACE_URI = "http://bstonetech.com/contract"; 

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "GetContractRequest") 
    @ResponsePayload 
    public GetContractResponse getContract(@RequestPayload GetContractRequest request, SoapHeader soapHeader) throws Exception { 
..... 
} 

答えて

0

申し訳ありません。私たちは春の統合4.3.0.RC1リリースで忙しかった:-)。

あなたは何かを見逃してしまったように見えます。あなたがサービスに@Endpointを持っており、@EnableWsまたは類似の春のWSメカニズムに依存しているとき

ザ・春のWS POJOのメソッド呼び出し注釈(@RequestPayload@PayloadRoot)とSOAP固有の引数の注入は、POJOのケースのために実際にあります。

一方、Spring Integration WSモジュールは完全にSpring WSプロジェクトに基づいていますが、すべてをSpring Integration Messagingモデルにできるだけ早く変換することを目指しています。したがって<ws:inbound-gateway>の結果はMessageで、request-channel="inboundGetContractChannel"に送信されます。あなたのケースでは、​​は、JaxBのマッピングに従って、あなたのドメインオブジェクトに対して既にアンマーシャリングされています。

<service-activator>は現在、メッセージングインフラストラクチャだけを扱うことができ、すでにSOAPについては何も知らない。これはメッセージングの一般的な目的です。完全に異なるソース(DBなど)に切り替えることはできますが、同じ<service-activator>を使用することができます。一貫して、まだDefaultSoapHeaderMapperでいくつかのSOAP情報、AbstractWebServiceInboundGateway相談を提供し、別MessageHeadersとしてsource.getSoapHeader()状態を抽出する@Payload@Header

ような有用な注釈が存在するいくつかのPOJOメソッド呼び出しを満たすため

。したがって、リクエストから必要なヘッダーにアクセスできます。

+0

私は今理解しています。私は今、PayloadRootQNameEndpointMappingを使用してゲートウェイのマッピングを行い、エンドポイントをPOJOとして実装しています。 – alan

+0

それでも、これを行い、ダウンストリームのメッセージングを得ることができます。すべての@Endpoint設定を@MessagingGatewayレベルに移動してください。 –

+0

これから進むEnboundInterceptorを実装して、すべての着信Webサービスコールを傍受します。私はそれぞれのケースでデータベースに書き込み、成功または失敗をログに記録します。作成したデータベーステーブルの行IDをPOJOに渡すことができます。 MessageContextには設定できるプロパティがあることがわかります。 POJOでMessageContextを取得したり、POJOを実行する前にプロパティをヘッダーにマップすることは可能ですか? – alan

関連する問題