【问题标题】:JAXB: Empty string does not produce empty elementJAXB:空字符串不会产生空元素
【发布时间】: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


    【解决方案1】:

    感谢您将此问题 (https://bugs.eclipse.org/319028) 提请我们注意。该错误已得到修复,并将包含在 EclipseLink 2.1.1 维护版本中。如果您想更早地访问此修复程序,您可以从 7 月 8 日开始从以下网址获取每晚下载:

    【讨论】:

      【解决方案2】:

      抱歉。我认为我使用的是 Sun 的 JDK 中的 JAXB,但我没有。我的 classes/ 文件夹中有一个剩余的 jaxb.properties,它是在我生成绑定时由 JDeveloper 创建的。我实际上使用的是来自 EclipseLink/MOXy 的 JAXB2.0。

      删除属性文件允许使用 JAXB2.1 并修复了我的问题。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2017-10-13
      相关资源
      最近更新 更多