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 <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 <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
,因为这是简单内容属性的默认名称。
这会让你发生碰撞。
我有以下 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 <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 <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
,因为这是简单内容属性的默认名称。
这会让你发生碰撞。