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 Schema 元素声明。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 打开了以下错误。
解决方法
您可以将属性设为 typeInteger
而不是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>