我正在使用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对象具有空字符串(<someStringField></someStringField>
)的值时,我需要让JAXB的marshaller生成一个空元素(例如<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>
有人能发现我做错了吗?
答案 0 :(得分:1)
感谢您提出此问题(https://bugs.eclipse.org/319028)。该错误已得到修复,将包含在EclipseLink 2.1.1维护版本中。如果您想更早地访问此修复程序,可以从7月8日开始每晚下载:
答案 1 :(得分:0)
道歉。我 THOUGHT 我使用的是Sun的JDK的JAXB,但事实并非如此。我的类/文件夹中有一个遗留的jaxb.properties,它是由JDeveloper在生成绑定时创建的。我实际上是在使用EclipseLink / MOXy中的JAXB2.0。
删除属性文件允许使用JAXB2.1并修复我的问题。