JAXB/XJC 重命名与多次 XSD 编译的外部绑定
JAXB/XJC external binding for renaming versus multiple XSD compile
(我已经用谷歌搜索并在这里搜索了,但没有找到答案,也许我使用了错误的关键字...)
为简单起见,我有两个模式:
a.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://foo.bar/something"
targetNamespace="http://foo.bar/something"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="TFoo">
<xs:attribute name="version" type="xs:string" />
</xs:complexType>
</xs:schema>
b.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://foo.bar/something"
targetNamespace="http://foo.bar/something"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="TFoo">
<xs:attribute name="version" type="xs:string" />
<xs:attribute name="dateTime" type="xs:dateTime" />
</xs:complexType>
</xs:schema>
两者都有 相同的目标命名空间 和一个名为 TFoo.
的复杂类型
我有一个外部绑定,可以将 a.xsd 的生成的 class 名称从 TFoo 更改为 TFooA:
a-binding.xml:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
version="2.1">
<jxb:bindings schemaLocation="a.xsd">
<jxb:bindings node="//xs:complexType[@name='TFoo']">
<jxb:class name="TFooA"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
如果我单独编译 a.xsd :
$ xjc -b a-binding.xml a.xsd
parsing a schema...
compiling a schema...
bar/foo/something/ObjectFactory.java
bar/foo/something/TFooA.java
bar/foo/something/package-info.java
(看看我是怎么得到TFooA.java)
但是,如果我尝试同时编译这两个模式,我会得到:
$ xjc -b a-binding.xml a.xsd b.xsd
parsing a schema...
[ERROR] 'TFoo' is already defined
line 13 of file:/home/scherrer/tmp/PL_008f/b.xsd
[ERROR] (related to above error) the first definition appears here
line 9 of file:/home/scherrer/tmp/PL_008f/a.xsd
Failed to parse a schema.
我知道TFoo定义了两次,这就是为什么我有外部绑定来解决冲突。
Obs.两个schema都是虚构的,为了举例说明问题而写的,真实的(很多)是第三方提供的,我无法更改。
谁能告诉我这是某种 xjc 限制(未列出 here)还是根本不应该起作用?或者可能是一个错误?
提前致谢。
有 2 个不同的模式文档定义相同的名称 space(甚至更糟 - 相同的元素)等同于有 2 个不同的 jar 包含相同的包和相同的 class(es)包裹。这不是 jaxb 本身的限制 - 它违反了模式名称 spaces 的含义。
简而言之,您不能同时处理这些模式。
生成器无法创建 classes,因为它不知道要引用什么。失败发生在您尝试重命名之前。它发生在读取模式时。
您可以做的是单独处理模式并更改使用的 java 包名称。这避免了 java 包 space 中的命名冲突,并且基本上将模式文档视为完全独立的实体,彼此之间没有引用。这可以通过定义要在绑定中使用的包名称来完成:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
version="2.1">
<jxb:bindings schemaLocation="a.xsd" node="/xs:schema">
<jxb:schemaBindings>
<jxb:package name="com.foo.a"></jxb:package>
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
我认为您发现了数据绑定的局限性。请尝试 data projection(披露:我隶属于该项目)。
您的架构 b.xsd 看起来就像 a.xsd 的扩展。您可以创建适合 b.xsd 的投影界面,并将其用于适合 a.xsd 或 b.xsd.
的任何文档
(我已经用谷歌搜索并在这里搜索了,但没有找到答案,也许我使用了错误的关键字...)
为简单起见,我有两个模式:
a.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://foo.bar/something"
targetNamespace="http://foo.bar/something"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="TFoo">
<xs:attribute name="version" type="xs:string" />
</xs:complexType>
</xs:schema>
b.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://foo.bar/something"
targetNamespace="http://foo.bar/something"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:complexType name="TFoo">
<xs:attribute name="version" type="xs:string" />
<xs:attribute name="dateTime" type="xs:dateTime" />
</xs:complexType>
</xs:schema>
两者都有 相同的目标命名空间 和一个名为 TFoo.
的复杂类型我有一个外部绑定,可以将 a.xsd 的生成的 class 名称从 TFoo 更改为 TFooA:
a-binding.xml:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
version="2.1">
<jxb:bindings schemaLocation="a.xsd">
<jxb:bindings node="//xs:complexType[@name='TFoo']">
<jxb:class name="TFooA"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
如果我单独编译 a.xsd :
$ xjc -b a-binding.xml a.xsd
parsing a schema...
compiling a schema...
bar/foo/something/ObjectFactory.java
bar/foo/something/TFooA.java
bar/foo/something/package-info.java
(看看我是怎么得到TFooA.java)
但是,如果我尝试同时编译这两个模式,我会得到:
$ xjc -b a-binding.xml a.xsd b.xsd
parsing a schema...
[ERROR] 'TFoo' is already defined
line 13 of file:/home/scherrer/tmp/PL_008f/b.xsd
[ERROR] (related to above error) the first definition appears here
line 9 of file:/home/scherrer/tmp/PL_008f/a.xsd
Failed to parse a schema.
我知道TFoo定义了两次,这就是为什么我有外部绑定来解决冲突。
Obs.两个schema都是虚构的,为了举例说明问题而写的,真实的(很多)是第三方提供的,我无法更改。
谁能告诉我这是某种 xjc 限制(未列出 here)还是根本不应该起作用?或者可能是一个错误?
提前致谢。
有 2 个不同的模式文档定义相同的名称 space(甚至更糟 - 相同的元素)等同于有 2 个不同的 jar 包含相同的包和相同的 class(es)包裹。这不是 jaxb 本身的限制 - 它违反了模式名称 spaces 的含义。
简而言之,您不能同时处理这些模式。
生成器无法创建 classes,因为它不知道要引用什么。失败发生在您尝试重命名之前。它发生在读取模式时。
您可以做的是单独处理模式并更改使用的 java 包名称。这避免了 java 包 space 中的命名冲突,并且基本上将模式文档视为完全独立的实体,彼此之间没有引用。这可以通过定义要在绑定中使用的包名称来完成:
<jxb:bindings
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
version="2.1">
<jxb:bindings schemaLocation="a.xsd" node="/xs:schema">
<jxb:schemaBindings>
<jxb:package name="com.foo.a"></jxb:package>
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
我认为您发现了数据绑定的局限性。请尝试 data projection(披露:我隶属于该项目)。 您的架构 b.xsd 看起来就像 a.xsd 的扩展。您可以创建适合 b.xsd 的投影界面,并将其用于适合 a.xsd 或 b.xsd.
的任何文档