2

バックストーリー:

顧客が作成した (交渉不可) WSDL があります。これは、複数の Web 標準を 1 つのサービスに組み合わせたものです。この 1 つの SOAP サービスには、XSD をインポートする参照 (wsdl:import) WSDL ファイル内のバインディングを参照する 4 つの SOAP ポートがあり、依存関係ツリーが非常に複雑になります。

これはインポートによって行われるため、最上位の WSDL はそれほど大きくありません。WSDL2Java と wsimport はそれを妨げますが、私は JAXB オブジェクトにコンパイルされたスキーマのライブラリを使用して動作します。そこで、必要なすべての操作を備えた CXF サービスを作成し、SoapUI でテストすることができました (Java クラスを作成する必要がないため、最上位の WSDL を正常にインポートしました)。

すべての SOAP ポートが同じアドレスを指し、そのサービスがさまざまなポートからのすべての操作を処理するため、クライアントはサーバーがすべての操作が同じポートに属していると認識していることを知りません。

問題:

これは、CXF が WSDL を生成する場合に当てはまります。すべての操作を同じ名前空間を持つ 1 つのポートに配置します。顧客提供の WSDL では、サービス、ポート、およびバインディングがすべて同じ名前空間にあるわけではありません。@WebService(wsdlLocation="") アノテーションを使用してサービスに WSDL を提供しようとしましたが、それを解析してコードに一致させようとします (正常な世界でそうであるように)。

質問:

http://example.com/service?wsdl操作をインターセプト/オーバーライドして、顧客提供の wsdl を返したいと考えています。CXFでこれを行う方法はありますか?

4

1 に答える 1

2

ポートを別々のサービスに分割することになりましたが、それでもすべてのポートの情報を持つカスタム WSDL が必要でした。CXF でこれを行う方法は、インターセプターを作成することです。

WSDL 生成を定期的に処理する CXF インターセプターの例に従いました。 org/apache/cxf/frontend/WSDLGetInterceptor.java . カスタム WSDL を読み込み、プレースホルダーのホスト名をリクエスト URL から取得したホスト名に置き換えます。

次に、サービスを作成するときにカスタム インターセプターを追加する必要があります (構成には spring を使用します)。詳細については、http://cxf.apache.org/docs/interceptors.htmlを参照してください。

于 2013-01-29T15:47:08.487 に答える