为了避免 JAXB 从 XSD 生成重复的类,您可以使用本地或外部绑定为生成的类定义不同的名称。
<jaxb:bindings node="XPATH">
<jaxb:class name="YourDistinctName"/>
</jaxb:bindings>
Java 类名重复的一个原因是在全局绑定中使用 toplevel 作用域。
注意: localScoping 属性的值可以是
或nested
。此属性描述嵌套 XML 模式组件与嵌套模式派生的 JAXB 类或顶级模式派生的 JAXB 类的 JAXB 绑定。为了避免嵌套组件之间的命名冲突,该属性的默认值是嵌套的。当模式组件嵌套太深或应用程序不希望使用嵌套类或使用 JPA 时(JPA 第 2.1 节,实体必须是顶级类),开发人员可以将 localScoping 自定义为 toplevel。toplevel
例如,下载此演示 (zip) 并考虑其 XML 架构 trilogy.xsd,该架构对
Trilogy
书籍进行建模。它在根 trilogy
元素上定义一个 TOC,并为每个 book
定义另一个 TOC。该架构将每个 TOC 定义为匿名类型,并且每个 TOC 都有不同的用途。第一个目录描述了三本书的标题,但第二个目录是每本书的章节列表。两者具有相同的元素名称 <toc>...</toc>
,如该 XML 实例 trilogy.xml 所示,但需要不同的 Java 类定义。
当模式被定制为使用
<jaxb:globalBindings localScoping=”toplevel”/>
时,JAXB 会尝试根据一个元素名称生成两种类型,这会导致名称冲突。
为了解决 Java 类名重复问题,演示使用 HiSrc BasicJAXB 项目中的工具来扫描 XSD 并输出这些建议的绑定:trilogy.xjb。例如,这是书 TOC 的装订:
<jaxb:bindings node="//xs:element[@name='trilogy']/xs:complexType/xs:sequence/xs:element[@name='book']/xs:complexType/xs:sequence/xs:element[@name='toc']/xs:complexType">
<jaxb:class name="TrilogyBookTocType"/>
</jaxb:bindings>
绑定使用 XPATH 选择目标节点,并将 Java 类名称声明为
TrilogyBookTocType
。
演示提供了一个 bash 脚本来运行该工具,但它可以像这样手动运行...
java -cp \
$HOME/.m2/repository/org/patrodyne/jvnet/hisrc-basicjaxb-tools/2.1.1/hisrc-basicjaxb-tools-2.1.1.jar \
org.jvnet.basicjaxb.util.CreateToplevelXJBindings \
--nested src/main/resources/trilogy.xsd
该工具将其输出发送到
stdout
,您可以在其中将其复制/粘贴到绑定文件或架构中。
该演示是一个独立的 Maven 项目。您可以使用以下命令运行测试:
mvn -Ptest clean test
mvn -Pexec compile exec:java
hisrc-higherjaxb-maven-plugin 配置为使用提供的 trilogy.xsd 模式和绑定文件 trilogy.xjb 生成 JAXB 类。该模式提供了命名空间
"http://org.example/trilogy"
,JAXB 使用它来使用自己的命名约定创建 Java package
名称。
作为一个选项,可以使用这些
XJChisrc-basicjaxb-plugins 生成 Java 内置
Object
方法的更高级实现。特别是,示例项目使用 toString
插件来显示未编组的 Trilogy
对象的人类可读表示。
hisrc-basicjaxb-插件
<args>
<arg>-no-header</arg>
<arg>-XhashCode</arg>
<arg>-Xequals</arg>
<arg>-XtoString</arg>
</args>
注意: 使用 XJC hisrc-basicjaxb-plugins 时,运行时类路径需要 hisrc-basicjaxb-runtime 依赖。
JUnit 测试类 TrilogyTest.java 扫描示例文件并调用方法
checkSample(File sample)
将每个文件提供给测试人员。对于此项目,创建了一个 JAXBContext
,并且 samples 路径中的每个文件都被 unmarshaled 为 Trilogy
对象。成功后,每个对象都会被编组以用于日志记录和您的审查。
具有
main(...)
方法的 Java 标准引擎应用程序位于 org.example.trilogy.Main
。该应用程序使用以下命令执行:
mvn -Pexec compile exec:java -Dexec.args="src/test/samples/trilogy.xml"
免责声明:我是这些HiSrc项目的维护者。