我正在使用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"用于XML绑定的JavaTM体系结构(JAXB)参考实现,(在JDK 6中构建JAXB 2.1.10)
当JAXB对象具有空字符串()的值时,我需要让JAXB的marshaller生成一个空元素(例如<someStringField></someStringField>或).但是,JAXB并没有这样做,而是从输出中省略了元素(就好像它是一个可选元素).<someStringField/>""
我在Internet上的搜索表明,只要将字段设置为非空的空字符串(即myJAXBObject.setSomeStringField("");),JAXB通常应该创建此标记:
如何使用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" />
Run Code Online (Sandbox Code Playgroud)
生成的代码看起来像这样(两个元素都是一样的):
@XmlElement(name = "someStringField", required = true)
protected String someStringField;
@XmlElement(name = "someOtherStringField", required = true)
protected String someOtherStringField;
Run Code Online (Sandbox Code Playgroud)
但是,当我编组以下对象时......
outerElement.setSomeStringField("");
outerElement.setSomeOtherStringField("Value was set");
Run Code Online (Sandbox Code Playgroud)
我明白了:
<outerElement>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)
当我期待:
<outerElement>
<someStringField></someStringField>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)
要么:
<outerElement>
<someStringField/>
<someOtherStringField>Value was set</someOtherStringField>
</outerElement>
Run Code Online (Sandbox Code Playgroud)
谁能发现我做错了什么?
感谢您让我们注意到这个问题 ( https://bugs.eclipse.org/319028 )。该错误已得到修复,并将包含在 EclipseLink 2.1.1 维护版本中。如果您想提前访问此修复程序,您可以从 7 月 8 日开始从以下位置获取夜间下载: