3

CXFドキュメントで説明されているようにSOAPインターセプターを作成しました:

public class SoapMessageInterceptor extends AbstractSoapInterceptor {
    public SoapMessageInterceptor() {
        super(Phase.USER_PROTOCOL);
    }
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        // ...
    }
}

そして、Springのアプリケーションコンテキストでバスに登録しました。

  <cxf:bus>
    <cxf:inInterceptors>
      <ref bean="soapMessageInterceptor"/>
    </cxf:inInterceptors>
  </cxf:bus>

  <jaxws:endpoint id="customerWebServiceSoap"
        implementor="#customerWebServiceSoapEndpoint"
        address="/customerService"/>

RESTサービスを追加するまで、すべて正常に機能していました。

  <jaxrs:server id="customerWebServiceRest" address="/rest">
    <jaxrs:serviceBeans>
      <ref bean="customerWebServiceRestEndpoint" />
    </jaxrs:serviceBeans>
  </jaxrs:server>

問題は、SOAPインターセプターがRESTリクエストでもトリガーされるようになったことです。これにより、RESTサービスが呼び出されたときにクラスキャスト例外が発生します。

<ns1:XMLFault xmlns:ns1="http://cxf.apache.org/bindings/xformat">
  <ns1:faultstring xmlns:ns1="http://cxf.apache.org/bindings/xformat">
    java.lang.ClassCastException: org.apache.cxf.message.XMLMessage
    cannot be cast to org.apache.cxf.binding.soap.SoapMessage
  </ns1:faultstring>
</ns1:XMLFault>

設定によってのみインターセプターをSOAPメッセージに制限する方法はありますか?

アップデート

これを説明しているドキュメントのページを見逃したようです。[JAXRSフィルターとCXFインターセプターの違い]まで下にスクロールします

4

2 に答える 2

11

バスではなく、個々のエンドポイントにインターセプターを接続できます。

<jaxws:endpoint id="customerWebServiceSoap"
    implementor="#customerWebServiceSoapEndpoint"
    address="/customerService">
  <jaxws:inInterceptors>
    <ref bean="soapMessageInterceptor"/>
  </jaxws:inInterceptors>
</jaxws:endpoint>
于 2012-10-12T22:42:31.613 に答える
4

次のようにインターセプターを構成してみてください。

  <cxf:bus name="someBus">
    <cxf:inInterceptors>
      <ref bean="soapMessageInterceptor"/>
    </cxf:inInterceptors>
  </cxf:bus>

ドキュメントによると、バスを一意のBeannameとして識別するバスのを定義することによって。Spring次に、JAX-WSエンドポイント構成で、その名前を参照するバスを指定する必要があります。

  <jaxws:endpoint id="customerWebServiceSoap"
        implementor="#customerWebServiceSoapEndpoint"
        address="/customerService"
        bus="someBus"/>

そして、これはこのエンドポイントbusでのみ機能するはずです。JAX-WS

于 2012-10-12T22:07:03.267 に答える