8

CXF を使用してアダプターを生成している Java ショップが使用する WCF サービスを作成しました。Java にはあまり詳しくありませんが、basicHttpBinding、SSL、および基本認証を使用してサービスを公開しました。統合テストは、.NET クライアントがサービスを問題なく使用できることを示しています。ただし、Java ショップはサービスの利用に問題があります。具体的には、次の JAXB エラーが発生します。2 つの宣言により、ObjectFactory クラスで衝突が発生します。これは通常、CXF がアダプター クラスを作成しようとしたときに、2 つの操作が同じ名前と名前空間を持つ場合に発生します。

なんらかの衝突を引き起こす型や操作の名前が見つかりません。すべてのカスタム タイプで名前空間が指定されていること、および tempuri.org が WSDL のどこにも指定されていないことを確認しました。Java ショップは、生成された WSDL に <xsd:import 要素が含まれているため、エラーが発生したと考えています。

だから、私の質問:

  • Java ショップが WCF サービスを使用するための CXF よりも良い方法はありますか? Project Tango は面白そうですが、使用を検討するように伝えるには十分な知識がありません。CXF は Java の事実上の標準ですか?
  • BasicHttpBinding/SSL/Basic Auth は、MS が相互運用シナリオに推奨するものですが、クライアントにはまだ相互運用の問題があるようです。これを使いやすくするために、他のバインディングや設定を検討する必要がありますか?
  • スキーマのインポートなしで常に単一の WDSL を出力するように WCF を構成する方法はありますか?
4

6 に答える 6

4

「2つの宣言によりObjectFactoryクラスで衝突が発生します」というエラーメッセージは、通常、インポートとは関係ありません。これはJAXBエラーメッセージであり、通常、生成されたフィールド名が同じになる複数の要素などが原因で発生します。たとえば、次のような要素がある場合:

<element name = "Foo".../>および<elementname= "foo" ... />

それはそのエラーを引き起こす可能性があります。もう1つは、ハイフンやアンダースコアなど、通常は削除されて上限が設定されているものを使用することです。<element name = "doFoo".../>および<elementname= "do_foo" ... />

2.1.4では、-autoNameResolutionフラグを指定してwsdl2javaを実行してみることができます。そのSOMETIMESはこれに役立ちますが、常にではありません。残念ながら、これらの場合にJAXBが提供する情報はほとんど価値がなく、多くの場合、競合するタイプを見つけるのは試行錯誤です。:-(

于 2009-02-23T20:48:21.200 に答える
1

私は Java と WCF の相互運用性に深く関わっています。他の誰かが言ったように、ファイルベースの WSDL を使用している場合は、WSDL をフラット化する必要があります。ただし、私は Netbeans 6.5 を使用しており、 http://myservice/?wsdlのような実際の URL を指定すると、Netbeans は WCF によって生成されたデフォルトの wsdl に簡単に対処できます。実際には、サービスのバージョン管理、オプションのデータメンバー (Java ではうまくいかないため、すべてのデータメンバーを IsRequired=true にすることをお勧めします)、順序などを考慮する必要があります。

始めるのに本当に大変だったのはセキュリティでした。相互証明書認証を機能させる必要がありましたが、まだいくつかの問題があります。

于 2009-02-24T08:35:37.710 に答える
0

xsd:importの問題は非常に一般的です。一部のツールキットまたはランタイムはそれに対処できません。これに対処するために、WCFによって生成されるWSDLをフラット化できます。この投稿を確認してください。

CXFが適切なJavaスタックであるかどうかについて-私はそれを聞いたことがありませんか?AXISとJAX-WSをうまく使用しました。どちらも非常に簡単です。

于 2009-02-24T08:04:32.200 に答える
0

Java クライアントが WCF コンポーネントと対話する唯一の方法は、MS が推奨するように、basicHttpBinding、ws* などの HTTP メソッドの 1 つです。Java は、TCP、namedPipes、MSMQ などを介して WCF と通信できません。

私は非常に単純な WCF コンポーネントから始めます。これは、文字列を吐き出す単一のメソッドを持つものです。それをJavaで動作させてから、上に進んでください。公開しているすべてのものが基本型または適切に定義された [DataContract] オブジェクトで動作していることを確認してください。

于 2009-02-23T20:23:17.813 に答える
0

私は Axis2 クライアントで WCF を開発しました。私が成功裏に使用した認証方法は、BasicHttpBinding/SSL/Basic (トランスポート) と WS-Security with Username (および MTOM) です。

Metro の実装は、相互運用性をテストするために SUN と Microsoft によって使用されてい ます。

スキーマ定義用に WCF によって生成されたインポートについての手がかりがありません。

于 2009-02-23T20:40:12.220 に答える
0

これは Jaxb の問題です。私は同じ問題に遭遇しましたが、代わりに wsdl2java クライアント生成で xmlbeans オプションを使用しました。正直なところ、この Web サービスの消費者としては、jaxb よりも xmlbeans オブジェクトを好むようです。

于 2010-07-19T16:21:54.963 に答える