JAX-WSでは、送信されるすべてのクラスにデフォルトのコンストラクター(引数なしのコンストラクター)が必要です。クライアントはWSDLに基づいて独自のクラスを作成するため、その要件を理解していません。IMOこの要件は、Webサービスの入力パラメーターとして使用されるクラスに対してのみ意味があります。
誰かがその要件を回避する方法を知っていますか?
JAX-WSでは、送信されるすべてのクラスにデフォルトのコンストラクター(引数なしのコンストラクター)が必要です。クライアントはWSDLに基づいて独自のクラスを作成するため、その要件を理解していません。IMOこの要件は、Webサービスの入力パラメーターとして使用されるクラスに対してのみ意味があります。
誰かがその要件を回避する方法を知っていますか?
JAX-WSを使用する場合、JAXB実装を使用してJavaオブジェクトをXMLにシリアル化します。
したがって、「問題」はJAXBの動作方法です。
JAXBを使用するには、マーシャリング/アンマーシャリングできるすべてのクラスを渡すJAXBContextを作成する必要があります。コンテキストを作成するとき、JAXBは、指定されたすべてのクラスに引数なしのコンストラクターがあることを確認します。これらのクラスの少なくとも1つにこの種のコンストラクターがない場合、コンテキストは作成されません。
なぜJAXBがこれを行うのですか?この引数なしのコンストラクターは、XMLからオブジェクトへの変換(非マーシャリング)の場合にのみ必要ですが、問題は、コンテキストを作成するときに、JAXBが何をしたいのか(マーシャルまたはアンマーシャル)を認識しないことです。
結論: JAXBは、マーシャリングおよびアンマーシャリングできるクラスのみを受け入れます。詳細はこちら
これを知って、JAX-WSで何が起こりますか?
を宣言すると@WebMethod
、パラメータと戻り値のクラスがJAXBコンテキストに追加されます。このため、Webサービスの入力と出力に関連するすべてのクラスには引数なしのコンストラクターが必要です。
結論: JAXB障害です;-)
しかし、引数なしのコンストラクターを持たないクラスを使用する必要がある場合はどうなりますか?
XMLAdapterを使用できます!詳細については、この投稿を確認してください...
誰かがその要件を回避する方法を知っていますか?
はい-JAX-WSを書き直します。
おそらく、デフォルトのctorとreflectionを使用してオブジェクトにデータを入力します。これは、あなたのような誰かが作成する可能性のあるすべてのctorを簡単に知ることができないためです。
これは、他の人のフレームワークを使用することの欠点です。他の人のルールに従ってプレイする必要があります。
クライアントはWSDLに基づいて独自のクラスを作成します
私はそれが図書館がクライアントを助けたものだと思いました。WSDLを解析および解釈するためのコードを記述していませんか?