xsd から生成されたクラスをマーシャリングして xml(gml) を生成する際に問題があります (maven2 xjc プラグインを使用しています)。
次のような gml:nilReason 属性を持つ要素で問題が発生します。
<element name="foo" nillable="true" maxOccurs="unbounded">
<complexType>
<complexContent>
<extension base="string">
<attribute name="nilReason" type="gml:NilReasonType"/>
</extension>
</complexContent>
</complexType>
</element>
生成されたクラスは次のようになります。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
public static class Foo
extends String
{
@XmlAttribute
protected List<String> nilReason;
/**
* Gets the value of the nilReason property.
*
* <p>
* This accessor method returns a reference to the live list,
* not a snapshot. Therefore any modification you make to the
* returned list will be present inside the JAXB object.
* This is why there is not a <CODE>set</CODE> method for the nilReason property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getNilReason().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link String }
*
*
*/
public List<String> getNilReason() {
if (nilReason == null) {
nilReason = new ArrayList<String>();
}
return this.nilReason;
}
public boolean isSetNilReason() {
return ((this.nilReason!= null)&&(!this.nilReason.isEmpty()));
}
public void unsetNilReason() {
this.nilReason = null;
}
public boolean isNil() {
return nil;
}
public void setNil(boolean nil) {
this.nil = nil;
}
}
問題は、属性 nilReason を xsi:nil と一緒に設定する必要があることです。Foo のインスタンスを作成し、nilReason リスト値 ex に追加するとします。「テンプレート」には、xsi:nil 属性が true に設定されていません。null オブジェクトをリストに追加すると、xsi:nil="true" が取得されますが、nilReason 値を設定できません。
いくつかのバインド方法を探してみましたが、うまくいきませんでした。
私が見つけた唯一の解決策は、次のように生成されたクラスに属性を手動で追加することです。
@XmlAttribute(namespace = "http://www.w3.org/2001/XMLSchema-instance")
private boolean nil;
しかし、生成されたクラスへの干渉を避けたいと思っています。
何か案は?