9

Spring-WS を使用する場合、私は常にアノテーションを使用しているため、構成は非常に最小限です。最近、SOAP 応答に添付ファイルを含める方法をテストし、それを機能させる方法をテストしようとしていましたが、最終的に次の構成になりました。

<bean id="messageReceiver"
    class="org.springframework.ws.soap.server.SoapMessageDispatcher">
    <property name="endpointAdapters">
        <list>
            <ref bean="defaultMethodEndpointAdapter" />
        </list>
    </property>
</bean> 

<bean id="defaultMethodEndpointAdapter"
    class="org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter">
    <property name="methodArgumentResolvers">
        <list>
            <!-- Be careful here! You might need to add more processors if you do 
                more than webservices! -->
            <ref bean="marshallingPayloadMethodProcessor" />
        </list>
    </property>
    <property name="methodReturnValueHandlers">
        <list>
            <ref bean="marshallingPayloadMethodProcessor" />
        </list>
    </property>
</bean>     

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="com.mypackage.ws" />
    <property name="mtomEnabled" value="true" />
</bean>

<bean id="marshallingPayloadMethodProcessor"
    class="org.springframework.ws.server.endpoint.adapter.method.MarshallingPayloadMethodProcessor">
    <constructor-arg ref="marshaller" />
    <constructor-arg ref="marshaller" />
</bean> 

上記で、添付ファイル付きの SOAP 応答を生成できます。問題は、何が起こっているのか本当に理解していないことです。(つまり、MTOM 添付ファイルを有効にする上記の構成は何ですか。

添付ファイルを有効にするには:

  • JAXB マーシャラーを構成する必要があるのはなぜですか? 添付ファイルを使用しないすべての Web サービスは、この構成がなくても正常に動作します。@EndPoint アノテーションを使用するだけです。非添付 Web サービスの要求/応答オブジェクトも JAXB ベースであるため、これはおそらく私がこれを正しく行っていないことを示唆しています (たとえそれが機能していても)。

  • 上記の構成に示されている messageReceiver および defaultmethodEndpointAdapter Bean の目的は何ですか? 非添付エンドポイントは、これらがなくても正常に機能します。

  • 最後に、XML の代わりに上記の構成のいずれかに注釈を付けることができますか? JAX-WS には @MTOM アノテーションがあることに気付きましたが、Spring-WS に相当するものが見つかりませんでした

サービスは期待どおりに機能しますが、構成が正しくない可能性があるのではないかと少し心配しています。これらが必要な理由を理解したいので、自分のしていることは正しいか間違っているかについて、より良い判断を下すことができるかもしれません。

前もって感謝します

4

2 に答える 2

3

自分で作成しなくても、Spring がこれらの Bean を自動的に作成します。そのため、以前は必要がありませんでした。

mtom を有効にするには、マーシャラーで mtomEnabled = true を設定します。自分でマーシャラーを作成したので、特にそれに依存する Bean を作成する必要があります。そうしないと、Spring がマーシャラーを認識できないからです。

MarshallingPayloadMethodProcessor が自分で定義せずにデフォルトで作成されるかどうかは 100% わかりませんが、DefaultMethodEndpointAdapter は 100% 確実です。

DefaultMethodEndpointAdapter の仕事は、エンドポイントをマップするためだけにあり、エンドポイントを呼び出す前に引数ハンドラーに委譲し、そこから戻り値を取得して mtom メッセージに変換するなどのタスクを実行できます。それが MarshallingPayloadMethodProcessor の機能です。

上記にも注釈を付けることができます。https://github.com/spring-projects/spring-ws-samples/tree/master/mtomにある Spring WS mtom サンプルをご覧ください。

要約すると、余分な Bean をすべて作成する必要があるのは、マーシャラーをカスタマイズしたためです。それを行ったので、それに依存する任意の Bean も作成し、依存関係を渡す必要があります (Spring が規則に従って (messageSource のように) 検索する Bean 名を使用しない限り)。

于 2014-09-30T03:05:24.667 に答える