Jaxb xjc 绑定,按规则重命名包

问题描述

我们有一组由第三方提供的 XSD 文件。我们无法控制它们。

用于命名空间版本化的命名在使用 xjc 生成 Java 代码时会产生冲突。这里有一个命名示例(我们有大约 20 个此类文件的 XSD):

<xs:schema xmlns:v1.0="com:company:app:api:deFinitions:v1.0" ...></xs:schema>
<xs:schema xmlns:v1.1="com:company:app:api:deFinitions:v1.1" ...></xs:schema>
<xs:schema xmlns:v1.2="com:company:app:api:deFinitions:v1.2" ...></xs:schema>
<xs:schema xmlns:v2.0="com:company:app:api:deFinitions:v2.0" ...></xs:schema>
<xs:schema xmlns:v2.1="com:company:app:api:deFinitions:v2.1" ...></xs:schema>
<xs:schema xmlns:v2.2="com:company:app:api:deFinitions:v2.2" ...></xs:schema>

问题是命名空间的结尾。由于最后一个“.[number]”部分会创建一个无效的 Java 包名,xjc 会从生成的 java 包名中删除该部分。认情况下,这些命名空间会转换为这些包名称

package com.company.app.api.deFinitions.v1;
package com.company.app.api.deFinitions.v1;
package com.company.app.api.deFinitions.v1;
package com.company.app.api.deFinitions.v2;
package com.company.app.api.deFinitions.v2;
package com.company.app.api.deFinitions.v2;

这些命名空间包含具有相同名称的类型。因此,当您尝试使用 xjc 生成此 XSD 的 Java 表示时,会发生冲突:

[错误] 具有相同名称“com.company.app.api.deFinitions.v1.OneType”的类/接口已在使用中。使用类自定义解决此冲突。

为了解决这个问题,我们维护了一个单独的绑定文件,该文件一一声明了所有包名称翻译(到现在为止有 18 个):

...
<jaxb:bindings schemaLocation="DeFinitions.1.0.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="com.company.app.api.deFinitions.v10" />
    </jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="DeFinitions.1.1.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="com.company.app.api.deFinitions.v11" />
    </jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="DeFinitions.1.2.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="com.company.app.api.deFinitions.v12" />
    </jaxb:schemaBindings>
</jaxb:bindings>
...

随着我们不断收到新的架构文件版本,我们预计这种类型的命名冲突会定期增加

问题是是否有任何方法可以在绑定文件中设置唯一规则来解决这个问题,而不是为我们检测到的每个冲突向绑定文件添加新规则。正则表达式或类似的东西。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)