WSDL で同じサービス名とポート名を持つ Web サービスに接続するための CXF (2.2.7) Web クライアントを開発しています。クライアントは秘密鍵を使用して SSL 経由で接続し、同じ秘密鍵でメッセージに署名します。SSL 接続は、「http:conduit」構成を通じて機能します。接続できました。
サービスとポート名が同じで、解決方法がよくわからないため、春の設定に問題があります。クライアントを構成する通常の/よく知られた方法は次のとおりです。
<jaxws:client name="{http://bla.com/1.2/}PortA" createdFromAPI="true">...</jaxws:client>
ただし、これを実行すると、次のエラーが発生します。
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'bus' of bean class [org.apache.cxf.service.ServiceImpl]: Bean property 'bus' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
このエラーは、jaxws name 属性でポート名の代わりに「サービス」名を使用した場合 (PortA ではなく ServiceA) のよく知られたエラーです。ただし、私の場合、サービス名とポート名は同じです:(...そして、それは私のwdslではないため、変更できません...何が起こるかは、作成されたjaxws:client BeanがSpringによる自動配線によって構成されていることですただし、同じ名前を持ち、これらの定義は同じ名前で検索されるため、Port Bean の Spring 定義を使用します。バスはプロパティとして設定できますが、ServiceImpl では設定できません。
とにかく:これに対処する最善の方法は?CXF サイトで説明されているように、「昔ながらの」構成方法を使用してみました。
<jaxws:client id="someId" serviceClass="TheServiceClass" address="https://bla.com/webservice">
しかし、その結果、SSL エラーが発生します。どうやら、HTTP コンジット構成が自動的に jaxws クライアント構成にリンクされていないようです :(...そして、それを処理する方法が本当にわかりません。これを行う方法は?
現時点では、どの方法が最善かわかりません。サービス/ポートの名前を変更できる可能性があります (私は SOAP の専門家ではありません)。または、名前が同じであっても、ポートとサービスに対して一意になるように、Spring が使用する他の ID を使用して Bean 定義を検索しますか?
これについて何か助けてください。
追記: name 属性にワイルドカードを使用することで、「http:conduit」が昔ながらの構成で動作するようになりました。ただし、 ws-securityPolicy は、「よく知っている」構成を通じて行われたように自動的に取得されません...メッセージが署名されないように:(