我一直在寻找解决这个问题的最佳方法。
我的情况是,我有一个提供程序,它为我提供 XSD 文件来生成我将用来调用其 SOAP api 的类型。这些 XSD 文件有时包含完全相同的数据结构。然而,由于它们驻留在不同的 XSD 文件中,因此它们将生成自己的类型,即使这些类型的字段具有完全相同的名称。
最终目标是能够处理一种类型,以便我可以为它们编写可重用的逻辑。
我正在使用
com.helger.maven
jaxb40-maven-plugin
(从 highsource
jaxb-tools
分叉)以及 Java 17 从这些 XSD 文件生成 Java 类,然后我将这些 XSD 文件构建、编组并作为有效负载发送到其 SOAP API,如下所示以及用来绘制他们的响应。
我一直在研究:
剧集,但我无法让它发挥作用。我的理解(可能是错误的)是,我需要修改这些 XSD 文件并使用所有常见类型创建一个新的 XSD 文件并引用这些文件。不过,我不想弄乱这些 XSD 文件,因为我认为它很容易出错,而且它们的长度大约为 15.000 行,其中包含大量类型,因此这是不可行的(如果是这种情况)。
使用 MapStruct/ModelMapper 等映射库从一种类型映射到另一种类型。我也在努力让这项工作成功。我生成的 Java 类已配置为具有可选的 getters 和 builders。这似乎让事情变得更加困难。
将我的类编组为 XML,修改命名空间和根元素名称,以便能够将其解组到我的其他类中。然而,这感觉像是一种 hack,而且我再次弄乱了 XML 结构。
目前我不确定什么是解决我的问题的最佳解决方案,因此我在这里寻求一些建议。
如果有什么区别,我正在使用 Spring Boot。
提前致谢,
BR
我认为对您来说最好的选择是使用 jaxb-tools 继承插件(链接到 wiki)。您可以定义自己的接口(在您的 java 代码中),并使用绑定文件,说明公共类正在实现相同的接口。这样,您就可以创建独特的句柄 java 方法并尊重 JAXB 命名空间,而无需对 XSD 进行任何更改。
你会有类似的东西:
<jaxb:bindings
xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:inheritance="urn:jaxb.jvnet.org:plugin:inheritance"
jaxb:extensionBindingPrefixes="inheritance"
jaxb:version="3.0">
<jaxb:bindings schemaLocation="schema1.xsd" node="/xsd:schema">
<jaxb:bindings node="xsd:simpleType[@name='MyCommonType']">
<inheritance:implements>my.internalpackage.CommonTypeInterface</inheritance:implements>
</jaxb:bindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="schema2.xsd" node="/xsd:schema">
<jaxb:bindings node="xsd:simpleType[@name='MyCommonType']">
<inheritance:implements>my.internalpackage.CommonTypeInterface</inheritance:implements>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
如果您对该插件有任何问题或者维基不完整/不清楚某些点,请随意创建问题。我很乐意增强它。
另一种选择是要求提供商创建一个 common.xsd,其中包含将在其他 XSD 结构中使用的常见 XSD 类型。这样,您将能够使用 JAXB 正确处理它,并且只有一种处理方法,而无需使用此
inheritance
插件。