JAXB 将具有相同命名空间的多个文件绑定到同一个包
JAXB binding multiple files with same namespace to same package
我有这样的架构层次结构:
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-file:
创建一个条目
<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
中不起作用。
我有这样的架构层次结构:
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-file:
创建一个条目<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
中不起作用。