我正在使用来自 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 对象具有空字符串的值( <someStringField></someStringField>
)时,我需要让 JAXB 的编码器生成一个空元素(例如 <someStringField/>
或 ""
)。但是,JAXB 并没有这样做,而是从其输出中完全省略了该元素(就好像它是可选元素一样)。
我在 Internet 上的搜索表明 JAXB 通常应该创建此标记,只要您将该字段设置为非空的空字符串(即 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>
谁能发现我做错了什么?
最佳答案
感谢您提请我们注意此问题 (https://bugs.eclipse.org/319028)。该错误已得到修复,并将包含在 EclipseLink 2.1.1 维护版本中。如果您想更早地访问此修复程序,您可以从 7 月 8 日开始从以下位置获取每晚下载:
关于JAXB:空字符串不会产生空元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3186621/