运行“xjc -p foo.bar bmw.xsd”时出现JAXB错误:
[错误]已使用具有相同名称“foo.bar.Fault”的类/接口。 bmw.xsd第16行
[ERROR](与上述错误相关)从此处生成另一个。 abc.xsd第26行
它与两个'错误'元素冲突有关吗?如果是这样,我该怎么做才能解决?
bmw.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://foo.com/bmw" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bmw">
<xs:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="abc.xsd"/>
<xs:element name="rule">
<xs:complexType>
<xs:sequence>
<xs:element ref="bmw:customer"/>
<xs:element ref="bmw:schemaName"/>
<xs:element ref="bmw:schemaVersion"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="customer" type="xs:integer"/>
<xs:element name="schemaName" type="xs:NCName"/>
<xs:element name="schemaVersion" type="xs:decimal"/>
<xs:element name="fault">
<xs:complexType>
<xs:sequence>
<xs:element ref="bmw:faultcode"/>
<xs:element ref="bmw:faultstring"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="faultcode" type="xs:integer"/>
<xs:element name="faultstring" type="xs:string"/>
</xs:schema>
abc.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bbs">
<xs:import namespace="http://foo.com/bmw" schemaLocation="bmw.xsd"/>
<xs:element name="Envelope">
<xs:complexType>
<xs:sequence>
<xs:element ref="env:Header"/>
<xs:element ref="env:Body"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element ref="bmw:rule"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Body">
<xs:complexType>
<xs:sequence>
<xs:element ref="env:Fault"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Fault">
<xs:complexType>
<xs:sequence>
<xs:element ref="bmw:fault"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
答案 0 :(得分:2)
解决名称冲突时,您有几个选择。
选项#1 - 架构注释
您可以注释XML架构以解决名称冲突:
<xs:element name="Fault">
<xs:annotation>
<xs:appinfo>
<jaxb:class name="Fault2" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="bmw:fault"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<强> abc.xsd 强>
请参阅“Fault”元素上的模式注释。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bmw="http://foo.com/bbs"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1">
<xs:import namespace="http://foo.com/bmw" schemaLocation="bmw.xsd" />
<xs:element name="Envelope">
<xs:complexType>
<xs:sequence>
<xs:element ref="env:Header" />
<xs:element ref="env:Body" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Header">
<xs:complexType>
<xs:sequence>
<xs:element ref="bmw:rule"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Body">
<xs:complexType>
<xs:sequence>
<xs:element ref="env:Fault" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Fault">
<xs:annotation>
<xs:appinfo>
<jaxb:class name="Fault2" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="bmw:fault"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
选项#2 - 外部绑定文件
您也可以使用外部绑定文件而不是修改XML架构:
<强> bindings.xml 强>
<jaxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="abc.xsd">
<jaxb:bindings node="//xs:element[@name='Fault']">
<jaxb:class name="Fault2"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
xjc命令是:
xjc -d out -b bindings.xml abc.xsd
包名称
要控制包名称,您可以将其作为参数传递给XJC命令:
xjc -d out -b bindings.xml -p com.foo.bar abc.xsd
或修改绑定文件。
答案 1 :(得分:0)
是的,您的错误与冲突有关。您可以使用customized binding解决此问题。自定义绑定是一种告诉JAXB执行除自然操作之外的其他操作的方法。如果您不能自己注释XSD,请尝试查看外部绑定文件中的class标记。