2012-07-11 6 views
5

JAX-WSでは、送信されるすべてのクラスにデフォルトのコンストラクタ(引数なしのコンストラクタ)が必要です。クライアントはWSDLに基づいて独自のクラスを作成するため、この要件を理解できません。 IMOこの要件は、Webサービスの入力パラメータとして使用されるクラスに対してのみ意味があります。JAX-WSによってエクスポートされるオブジェクトにデフォルトコンストラクタが必要なのはなぜですか?

誰もその要件を回避する方法を知っていますか?

答えて

6

あなたはJAX-WSを使用するときは、XMLにあなたのJavaオブジェクトをシリアライズするJAXB実装を使用しています。

したがって、「問題」はJAXBの仕組みです。

にJAXBを使用するには、/アンマーシャルマーシャリングできたJAXBContextそれを通過するすべてのクラスを作成する必要があります。コンテキストを作成するとき、JAXBは、指定されたすべてのクラスに引数なしのコンストラクタがあることをチェックします。これらのクラスの少なくとも1つにこの種のコンストラクタがない場合、コンテキストは作成されません。

なぜJAXBですか? XMLからObject(非マーシャリング)に変換する場合にのみ、この引数なしのコンストラクタが必要ですが、問題は、コンテキストを作成するときに、JAXBは何を行いたいか(マーシャリングまたは非マーシャリング)を知りません!

結論: JAXBは、整列化および非整列化できるクラスのみを受け入れます。詳細情報here

JAX-WSはどうなっていますか?

あなたが@WebMethodを宣言するとパラメータ戻り値クラスはJAXBコンテキストに追加されます。このため、Webサービスの入出力に関連するすべてのクラスには、引数なしのコンストラクタが必要です。

結論:は、JAXB障害;-)

しかし、私は引数なしのコンストラクタを持たないクラスを使用する必要がある場合は何ですか?

XMLAdapterを使用できます。詳細はthis postを参照してください。

+0

したがって、問題は、JAXBがマーシャリングまたは非マーシャルにするクラスを区別しないことが原因と思われます。この機能がサポートされていれば、JAX-WSは対応するJAXBContextを構築できます。私はJAXB仕様のために素晴らしい機能要求をすると思います。 – Stefan

+0

私はあなたに強く同意します。実際、MOXyのメンバー(EclipseLinkによるJAXBの実装)は、マルチargsコンストラクタのサポートを追加するオープンチケットを持っています: https://bugs.eclipse.org/bugs/show_bug.cgi?id=328951 – ggarciao

0

どのようにその要件を回避する方法を知っていますか?

はい - JAX-WSを書き換えます。

オブジェクトを作成するために、デフォルトのctorとリフレクションを使用している可能性があります。あなたのような誰かが作成した可能性のあるすべてのctorを簡単に知ることができないためです。

これは、他の誰かのフレームワークを使用することの欠点です。そのルールでプレーする必要があります。

クライアントは、私はそれがライブラリーは、クライアントが行う助けたものだと思ったWSDL

をもとに、独自のクラスを作成します。あなたはWSDLを解析して解釈するコードを書いていませんでしたか?

+0

オブジェクトは、サーバー側のJAX-WSによって生成されてはなりません。 JAX-WSはそれらを送信します。 – Stefan

関連する問題