java - JAXB/XJC 生成 JAXBElement<String> 而不仅仅是 String(以处理 null 大小写)

标签 java xml jaxb xsd

使用 JDK 1.7 附带的 JAXB/xjc (bin\xjc.exe)

这是我的 XSD 的片段:

<xs:complexType name="NameType">
    <xs:sequence>
      <xs:element name="Surname" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Firstname" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Middlename" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
</xs:complexType>

生成的类显示:

@XmlElementRef(name = "Surname", type = JAXBElement.class, required = false)
protected JAXBElement<String> surname;

public JAXBElement<String> getSurname() {
    return surname;
}
public void setSurname(JAXBElement<String> value) {
    this.surname = value;
}

我知道 JAXB 使用 JAXBElement 来允许 null,但这没有任何意义,因为任何声明为 String 的东西都可以设置为 null。

而且我没有更改 XSD 的选项,因为我的客户宁愿在生产中保留现有的 XSD。

问题:我可以更改代码生成器来生成:

@XmlElementRef(name = "Surname", type = String.class, required = false)
protected String surname;

public String getSurname() {
    return surname;
}
public void setSurname(String value) {
    this.surname = value;
}

谢谢 乔尔

最佳答案

默认情况下,当 XML 元素可空且可选时,会生成一个 JAXBElement

<xs:element name="Surname" type="xs:string" nillable="true" minOccurs="0" maxOccurs="1"/>

这是为了让您在以下场景中构造 XML:

  1. 当属性为 null 时,XML 文档中不应包含该元素。
  2. 当属性为 JAXBElement 且设置了 nil 标志时,该元素应以 xsi:nil="true" 的值出现在 XML 中。<

要摆脱 JAXBElement,您可以使用 generateElementProperty 选项作为 answered by f1sh,但是你将无法处理这两种情况。

了解更多信息

查看我对相关问题的回答:

关于java - JAXB/XJC 生成 JAXBElement<String> 而不仅仅是 String(以处理 null 大小写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549095/

相关文章:

jaxb - Gradle 中的自定义任务构建顺序

java - 对多个单元测试使用相同的 junit 临时文件夹

java - JSP 中选择表单填充的问题

java - java项目中xsl文件放在哪里?

android - 嵌套 ScrollView + TextView + RecyclerView

javascript - Node.js 中的 xml 宽度架构为 json

Java,多重继承。我应该怎么做?

java - 如何从java源文件中提取TODOS

java - MOXy/JAXB "prototype pattern"- 接口(interface)继承

xml - jaxb 不会为相同类型的不同元素生成类