JAXB 将具有相同名称空间的多个文件绑定到同一个包



我有一个这样的架构层次结构:

common
   |---legacy
   |      |---legacy.xsd xmlns="http://common/legacy"
   |      |---other.xsd  xmlns="http://common/legacy"
   |      '---....xsd    xmlns="http://common/legacy"
   |---send
          |---file.xsd xmlns="http://common/send"
          '---text.xsd xmlns="http://common/send"
          '---....xsd  xmlns="http://common/send"

一个文件夹中的所有文件都具有相同的命名空间。

现在我想将命名空间映射到特定的 java 包(我无法更改命名空间)。

我找到了将架构绑定到包的解决方案。但是,我必须为每个xsd文件创建一个条目:

<jaxb:bindings schemaLocation="./common/legacy/legacy.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="com.company/legacy"/>
    </jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="./common/legacy/other.xsd">
    <jaxb:schemaBindings>
        <jaxb:package name="com.company/legacy"/>
    </jaxb:schemaBindings>
</jaxb:bindings>
.....

有没有办法直接定义命名空间和包名称之间的绑定?

另一种方法是在 maven 中定义包:

<plugin>
 <groupId>org.jvnet.jaxb2.maven2</groupId>
 <artifactId>maven-jaxb2-plugin</artifactId>
 <configuration>
  <generatePackage>com.company/legacy</generatePackage>
 </configuration>
</plugin>

但是,我必须为每个文件夹创建一个执行,这不是我真正想要的。

免责声明:我是maven-jaxb2-plugin的作者。

XJC 从命名空间派生包,因此您(通常)无法为一个命名空间生成多个包。jaxb:class/@ref有一些技巧,但您不希望这些技巧,因为这可能会导致各种碰撞。

所以我的建议是定义多个执行,同一命名空间中的每个不同模式一个。您可以使用generatePackage尽管我通常建议在绑定中定义包映射。

执行

多个执行时,请确保每次执行使用不同的generateDirectory

顺便问一下,你为什么对多个绑定不舒服?

使用scd语法代替node="XPath" schemaLocation="path or *"

<jaxb:bindings scd="x-schema::tns" xmlns:tns="http://common/legacy">
    <jaxb:schemaBindings>
        <jaxb:package name="com.company.legacy"/>
    </jaxb:schemaBindings>
</jaxb:bindings>

并非在所有地方都支持 SCD。一些 XJC 自定义,如 jaxb2-basics,在 jaxb:bindings 中不起作用。

  • JAXB RI 2.1 用户指南
  • 架构组件指示符 - 建议

最新更新