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インターセプターの違い]まで下にスクロールします