处理从 XSD 文件生成的两种不同 Java 类型中相同数据的最佳方法

问题描述 投票:0回答:1

我一直在寻找解决这个问题的最佳方法。

我的情况是,我有一个提供程序,它为我提供 XSD 文件来生成我将用来调用其 SOAP api 的类型。这些 XSD 文件有时包含完全相同的数据结构。然而,由于它们驻留在不同的 XSD 文件中,因此它们将生成自己的类型,即使这些类型的字段具有完全相同的名称。

最终目标是能够处理一种类型,以便我可以为它们编写可重用的逻辑。

我正在使用

com.helger.maven
jaxb40-maven-plugin
(从
highsource
jaxb-tools
分叉)以及 Java 17 从这些 XSD 文件生成 Java 类,然后我将这些 XSD 文件构建、编组并作为有效负载发送到其 SOAP API,如下所示以及用来绘制他们的响应。

我一直在研究:

  1. 剧集,但我无法让它发挥作用。我的理解(可能是错误的)是,我需要修改这些 XSD 文件并使用所有常见类型创建一个新的 XSD 文件并引用这些文件。不过,我不想弄乱这些 XSD 文件,因为我认为它很容易出错,而且它们的长度大约为 15.000 行,其中包含大量类型,因此这是不可行的(如果是这种情况)。

  2. 使用 MapStruct/ModelMapper 等映射库从一种类型映射到另一种类型。我也在努力让这项工作成功。我生成的 Java 类已配置为具有可选的 getters 和 builders。这似乎让事情变得更加困难。

  3. 将我的类编组为 XML,修改命名空间和根元素名称,以便能够将其解组到我的其他类中。然而,这感觉像是一种 hack,而且我再次弄乱了 XML 结构。

目前我不确定什么是解决我的问题的最佳解决方案,因此我在这里寻求一些建议。

如果有什么区别,我正在使用 Spring Boot。

提前致谢,

BR

java xsd jaxb mapstruct xjc
1个回答
0
投票

我认为对您来说最好的选择是使用 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
插件。

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