我的模型对象看起来像这样:
@XmlRootElement(name = "appConfig")
@XmlType(propOrder = {})
public class Config implements Serializable {
...
private int advancedFooBar;
...
@XmlElement(name = "advancedfoobar")
public int getAdvancedFooBar() {
return advancedFooBar;
}
public void setAdvancedFooBar(int advancedFooBar) {
this.advancedFooBar = advancedFooBar ;
}
当我使用JXC生成针对此类的模式时,我最终得到以下属性的以下内容:
<xs:element name="advancedfoobar" type="xs:int"/>
我希望这是一个可选元素,所以我尝试更改
@XmlElement(name = "advancedfoobar")
到
@XmlElement(name = "advancedfoobar", required=false)
但是,这并未导致对生成的架构进行任何更改。我需要做什么才能在生成的模式中将“advancedfoobar”元素定义为可选项?
我在Windows 7旗舰版x64上使用JDK 1.7.0_U3。
感谢。
-Noah
答案 0 :(得分:4)
JAVADOCS说什么
根据@XmlElement
的Javadoc(参见:http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#required%28%29)
如果required()为false,则Javabean属性将映射到XML 使用minOccurs =“0”的模式元素声明。对于a,maxOccurs为“1” 单值属性和多值属性的“无界”。
以下映射的advancedfoobar
架构定义应为minOccurs=0
:
@XmlElement(name = "advancedfoobar")
public int getAdvancedFooBar() {
return advancedFooBar;
}
和
@XmlElement(name = "advancedfoobar", required=false)
public int getAdvancedFooBar() {
return advancedFooBar;
}
MOXY和参考实施中的BU
EclipseLink JAXB (MOXy)和JAXB参考实现中似乎存在关于基元和可选元素的错误。我已经针对MOXy打开了以下错误。
解决方法强>
您可以设置Integer
类型的属性,而不是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>