JAXB 避免从 XSD 生成重复类

问题描述 投票:0回答:1
binding xsd jaxb wsdl
1个回答
0
投票

为了避免 JAXB 从 XSD 生成重复的类,您可以使用本地或外部绑定为生成的类定义不同的名称。

<jaxb:bindings node="XPATH">
    <jaxb:class name="YourDistinctName"/>
</jaxb:bindings>

Java 类名重复的一个原因是在全局绑定中使用 toplevel 作用域。

注意: localScoping 属性的值可以是

nested
toplevel
。此属性描述嵌套 XML 模式组件与嵌套模式派生的 JAXB 类或顶级模式派生的 JAXB 类的 JAXB 绑定。为了避免嵌套组件之间的命名冲突,该属性的默认值是嵌套的。当模式组件嵌套太深或应用程序不希望使用嵌套类或使用 JPA 时(JPA 第 2.1 节,实体必须是顶级类),开发人员可以将 localScoping 自定义为 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
名称。

作为一个选项,可以使用这些

XJC
hisrc-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项目的维护者。

© www.soinside.com 2019 - 2024. All rights reserved.