8

次の例のxsdスニペットを考えます。

< xs:attribute name="SEGMENT"  default="" use="optional" type="xs:string"/ >

xjcがSEGMENTbean属性を含むクラスを生成すると、次のゲッターが自動生成されます。

public String getSEGMENT() {
    if (segment == null) {
        return "";
    } else {
        return segment;
    }
}

xs:element私の質問は、オブジェクトに対して同じことをどのように行うのですか?言い換えると、次のxsdスニペットが与えられます。

< xs:element name="NAME" default="" type="xs:string"/ >

xjcに以下を生成させることができるかどうか知りたいです:

public String getNAME() {
    if (name == null) {
        return "";
    } else {
        return name;
    }
}

これはどのように行うことができますか?

4

1 に答える 1

2

JAXB は、 XML スキーマが要素と属性のデフォルトを区別するため、デフォルト値を持つ属性の場合と同じコードをデフォルト値を持つ要素に対して生成しません。

属性と要素の両方のデフォルト値は、default 属性を使用して宣言されますが、この属性の結果はそれぞれの場合でわずかに異なります。属性がデフォルト値で宣言されている場合、属性の値は、インスタンス ドキュメントで属性の値として表示される値です。属性がインスタンス ドキュメントに表示されない場合、スキーマ プロセッサはデフォルト属性の値と等しい値を属性に提供します。属性のデフォルト値は、属性自体がオプションの場合にのみ意味があることに注意してください。したがって、デフォルト値とオプション以外の値の両方を指定して使用するとエラーになります。

スキーマ プロセッサは、デフォルトの要素をわずかに異なる方法で扱います。要素がデフォルト値で宣言されている場合、要素の値は、インスタンス ドキュメントで要素のコンテンツとして表示される値です。要素がコンテンツなしで表示される場合、スキーマ プロセッサは要素にデフォルト属性の値と等しい値を提供します。ただし、要素がインスタンス ドキュメントに表示されない場合、スキーマ プロセッサは要素をまったく提供しません。要約すると、要素と属性のデフォルトの違いは次のように述べることができます: 属性が欠落している場合はデフォルトの属性値が適用され、要素が空の場合はデフォルトの要素値が適用されます。

欠落している属性のデフォルト値 (ここからは特別なゲッター) をいつでも当てにできますが、欠落している要素の値には問題があります。

それにもかかわらず、インスタンスをアンマーシャリングすると、アンマーシャラーはデフォルト値の処理方法を知っています。詳細はこちらをご覧ください:

XJC はゲッター コードを追加したり、フィールドをデフォルト値で初期化したりしません。そのため、「null セーフ チェック」が必要な場合は、XJC によってコードが生成された後に自分で手動で追加するか、プラグインを使用して実行してみてください。自動的:

于 2012-12-16T18:11:12.440 に答える