意図をより明確にするために、質問の形式を変更しました。
アーキテクチャ
私は、JAX-WS を使用して公開する予定の Web サービスをいくつか作成しています。しばらくの間使用してきたプロセスは、最初にリクエスト オブジェクトとレスポンス オブジェクトのみを定義するスキーマを作成することです。これは、xml メッセージの構造を承認するために顧客に送信されます。基本スキーマよりも複雑なので、wsdl全体を自分で書きたくありません。
次に、JAXB コマンド xjc を使用して、スキーマ内の要求と応答のタイプに基づいてクラスを生成します。次に、このクラスをパラメーターとして使用し、JAX-WS アノテーション付きエンドポイント クラスの型を返します。
これで、呼び出すことができる Web サービスが提供されます。これにより、送信される xml と返される xml をより細かく制御できるようになりますが、完全な wsdl を記述する際に必要な繰り返しも自動化されます。
問題
スキーマには、次のような要素があります。
<xs:element name="myElement" type="xs:string" nillable="true" minOccurs="0" />
したがって、ユーザー設定の null または空白を区別したいと思います。生成されたクラスには、この属性があります。
@XmlElementRef(name = "myElement", namespace = "/mynamespace", type = JAXBElement.class)
protected JAXBElement<String> myElement;
この結果、要素は nillable でもオプションでもなくなります。JAX-WS が wsdl の一部として記述するスキーマでは、要素が必須で nil 不可に設定されています。スキーマの検証をオフにしても、オブジェクトに nil を渡すことはできません。
試し
たこと必須でnillableに変更すると、この生成コードが得られます。
@XmlElement(required = true, nillable = true)
protected String myElement;
オプションに変更し、nillable に変更すると、この生成されたコードが得られます。
protected String myElement
したがって、JAXB を使用する場合は、どちらか一方を使用することも、両方を使用することもできません。がっかり!
また、生成されたクラスを次のように手動で変更しようとしました。
@XmlElementRef(name = "myElement", namespace = "/mynamespace", type = JAXBElement.class, required=false)
protected JAXBElement<String> myElement;
これで要素がオプションになりましたが、まだ nil に設定できません。これを行うと、空の文字列の値を持つ JAXBElement が生成されます。これは、結果の JAX-WS wsdl/schema が要素を nillable として設定しないため、スキーマ検証をオフにした場合のみです。そのため、有効なリクエストではありません。
まとめ
これは JAXB のバグだと思います。@XmlElementRef アノテーションには、必須ではないと設定する属性がありますが、フィールドを null 可能として設定する属性はありません。
@XmlElement アノテーションには、required と nullable の両方の属性がありますが、これらは null オブジェクトになるだけなので、xml に含まれていない要素と含まれていたが null の要素を区別する方法はありません。これが、JAXBElement とともに @XmlElementRef を使用する必要がある理由です。
このバグには 2 つの問題が含まれていると思います。最初に、xjc コマンドは、required=false で要素を生成する必要があります。次に、要素が null 可能かどうかを設定する @XmlElementRef の属性が必要であり、これも設定する必要があります。
誰かが修正/回避策を知っていますか? グーグルで検索してみましたが、回答なしで同じ質問をしている人しか見つかりませんでした。これは通常、それが不可能であることを意味します... TIA。
追加
私はjaxb 2.2.6を使用しており、mavenプラグインはjaxb2-maven-plugin 1.5です。