JAVADOCSのコメント
Javadocによると@XmlElement
( http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#required%28%29を参照)
required()がfalseの場合、JavabeanプロパティはminOccurs="0"を使用してXMLスキーマ要素宣言にマップされます。maxOccursは、単一値のプロパティの場合は「1」、複数値のプロパティの場合は「無制限」です。
のスキーマ定義は、次のマッピング用であるadvancedfoobar
必要があります。minOccurs=0
@XmlElement(name = "advancedfoobar")
public int getAdvancedFooBar() {
return advancedFooBar;
}
と
@XmlElement(name = "advancedfoobar", required=false)
public int getAdvancedFooBar() {
return advancedFooBar;
}
MOXyとリファレンス実装のバグ
プリミティブとオプションの要素に関して、EclipseLink JAXB(MOXy)とJAXBリファレンス実装の両方にバグがあるようです。私はMOXyに対して次のバグを開きました。
回避策
Integer
の代わりにtypeのプロパティを作成できますint
。または、アノテーションのtype
プロパティをに設定するだけです。値を保持できるタイプは、デフォルトでオプションになります。@XmlElement
Integer
null
構成
package forum13595629;
import java.io.Serializable;
import javax.xml.bind.annotation.*;
@XmlRootElement(name = "appConfig")
@XmlType(propOrder = {})
public class Config implements Serializable {
private int advancedFooBar;
@XmlElement(name = "advancedfoobar", type=Integer.class)
public int getAdvancedFooBar() {
return advancedFooBar;
}
public void setAdvancedFooBar(int advancedFooBar) {
this.advancedFooBar = advancedFooBar;
}
}
デモ
package forum13595629;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Config.class);
jc.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String namespaceUri,
String suggestedFileName) throws IOException {
StreamResult result = new StreamResult(System.out);
result.setSystemId(suggestedFileName);
return result;
}
});
}
}
出力
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="config">
<xsd:all>
<xsd:element name="advancedfoobar" type="xsd:int" minOccurs="0"/>
</xsd:all>
</xsd:complexType>
<xsd:element name="appConfig" type="config"/>
</xsd:schema>