【发布时间】:2010-07-29 03:34:45
【问题描述】:
我正在使用来自 Sun 的 JDK 1.6.0_18 的 JAXB 2.1.10:
D:\apps\jdk160_18\bin>xjc.exe -version xjc 版本“JDK 6 中的 JAXB 2.1.10” JavaTM Architecture for XML Binding(JAXB) 参考实现,(在 JDK 6 中构建 JAXB 2.1.10)
当 JAXB 对象具有空字符串 ("") 的值时,我需要让 JAXB 的编组器生成一个空元素(例如 <someStringField></someStringField> 或 <someStringField/>)。但是,JAXB 并没有这样做,而是从其输出中完全省略了该元素(就好像它是一个可选元素一样)。
我在 Internet 上的搜索表明 JAXB 通常应该创建此标记,只要您将该字段设置为非 null 空字符串(即 myJAXBObject.setSomeStringField(""); ):
How to instantiate an empty element with JAXB https://jaxb.dev.java.net/tutorial/section_2_2_12_8-No-Value.html#No%20Value
在我的 XSD 中,我试图(以我知道的所有方式)表明该元素的存在是强制性的,即使它是空的:
<xs:element name="outerElement">
<xs:complexType>
<xs:sequence>
<xs:element name="someStringField" type="xs:string" nillable="false" minOccurs="1" />
<xs:element name="someOtherStringField" type="xs:string" />
生成的代码如下所示(两个元素相同):
@XmlElement(name = "someStringField", required = true)
protected String someStringField;
@XmlElement(name = "someOtherStringField", required = true)
protected String someOtherStringField;
但是,当我编组以下对象时...
outerElement.setSomeStringField("");
outerElement.setSomeOtherStringField("Value was set");
我明白了:
<outerElement>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
当我期待时:
<outerElement>
<someStringField></someStringField>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
或者:
<outerElement>
<someStringField/>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
谁能发现我做错了什么?
【问题讨论】:
标签: jaxb