JAXB 属性 绑定 - 为什么需要这个

JAXB property bindings - why is this even needed

我有以下 xsd(我只 post 这里的相关部分,但命令也是 运行 针对此摘录)

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:complexType name="OptionType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="name" use="optional"/>
                <xs:attribute type="xs:string" name="value" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="ControllableType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:float" name="value" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

我运行下面的命令反对它:

xjc src/main/resources/session.xsd -p org.myorg.mypackage -d src/main/java/org/myorg/mypackage

我收到以下错误:

[ERROR] Property "Value" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 39 of jar:file:/usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar!/com/sun/xml/internal/xsom/impl/parser/datatypes.xsd

[ERROR] The following location is relevant to the above error
line 14 of file:/home/user/project/src/main/resources/session.xsd

[ERROR] Property "Value" is already defined. Use &lt;jaxb:property> to resolve this conflict.
line 39 of jar:file:/usr/lib/jvm/java-8-openjdk-amd64/lib/tools.jar!/com/sun/xml/internal/xsom/impl/parser/datatypes.xsd

[ERROR] The following location is relevant to the above error
line 7 of file:/home/user/project/src/main/resources/session.xsd

Failed to parse a schema.

我在这里阅读了一些关于绑定的内容:

Symbol is already defined. Use JAXB property to resolve the conflict

JAXB Compiling Issue - [ERROR] Property "Any" is already defined

但为什么需要这个呢? XML 元素名称与属性名称相结合,属性不是完全限定且唯一的吗?

喜欢"OptionType.value"或"ControllableType.value"

您似乎在尝试延长 java.lang.String。但是由于字符串 class 已经包含一个 "value" 属性,您不能在 child classes.-

中使用它

我想人们可能会忽略字符串 class 是最终的,因此无法扩展。当你重命名你的 "value" 属性时,你会看到 xjc 可以工作,但它仍然不会在生成的代码中扩展 String(因为这是不可能的),但 xjc 显然仍然会检查你的属性名称是否有效,这会导致问题。

@lexicore 在评论中解释了为什么这个假设是错误的:


考虑词典评论进行编辑

所以您的选择是重命名您的 "value"。检查@lexicores 的答案以了解原因。

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="OptionType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute type="xs:string" name="name" use="optional"/>
            <xs:attribute type="xs:string" name="my_value" use="optional"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>
<xs:complexType name="ControllableType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute type="xs:float" name="my_value" use="optional"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

或不在 xs:simpleContent 内使用 xs:extension。

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:complexType name="OptionType">
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="value" use="optional"/>
</xs:complexType>
<xs:complexType name="ControllableType">
    <xs:attribute type="xs:float" name="value" use="optional"/>
</xs:complexType>

问题是您的类型复杂,内容简单,属性 value:

<xs:complexType name="ControllableType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute type="xs:float" name="value" use="optional"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

这将允许类似

<somelement value="1.5">one and a half</somelement>

XJC 尝试创建两个属性:

  • 属性 value,
  • 一个简单的内容。

默认情况下,第一个 属性 被命名为 value,因为这是属性的名称。

第二个 属性 默认命名为 value,因为这是简单内容属性的默认名称。

这会让你发生碰撞。