JAXB属性绑定 - 为什么甚至需要它

时间:2017-08-20 20:20:18

标签: java xml xsd jaxb xjc

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

<?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”

2 个答案:

答案 0 :(得分:3)

问题在于您的复杂类型包含简单内容和属性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,因为这是简单内容属性的默认名称。

这会让你发生碰撞。

答案 1 :(得分:1)

看起来你正在尝试扩展java.lang.String。但由于String类已包含&#34;值&#34;您不能在您的子课程中使用该属性.-

我想可以忽略String类是final的,因此无法扩展。当您重命名&#34;值&#34;属性你将看到xjc将起作用,但它仍然不会在生成的代码中扩展String(因为它不可能),但是xjc显然仍然会检查你的属性名是否有效导致问题。

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

编辑考虑lexicores评论

因此,您可以选择重命名&#34;值&#34;。检查@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:扩展名。

<?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>