【问题标题】:Prevent generation of duplicate classes from XSDs without namespaces防止从没有命名空间的 XSD 生成重复的类
【发布时间】:2014-12-04 03:31:24
【问题描述】:

我目前正在使用由 JAXB 使用 Mojo Maven 插件“jaxb2-maven-plugin”生成的类为我们的 Netbeans 平台应用程序实现功能。不幸的是,XSD 文件的创建不在我手中,而且它们是保密的。我正在尝试提供一个最小的运行示例来进一步证明这一点,但现在我希望有人可以仅根据我的描述将我推向正确的方向。

我们有许多 XSD 文件,并在过去几周添加了一些文件。其中两个 XSD(我们称之为 A.xsd 和 B.xsd)包括另一个 XSD(我们称之为 common.xsd),其中包含其他两个 XSD 使用的通用类型。这个 common.xsd 有 no 命名空间,应该保持这种方式。

这会产生以下问题:对于此 common.xsd 中定义的类型,xjc 生成了三个重复项。一个位于名为“生成”的包中(正是我想要使用的类),另外两个位于 A.xsd 和 B.xsd 的包中,它们与“生成”中的类几乎相同,除了一些命名空间我不需要。

通过阅读 Stackoverflow 上的其他一些问题,我了解到 Episodes 可以解决此问题,但我无法让它与没有命名空间的 XSD 一起使用。

我的 POM 中的插件配置非常简单:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <configuration>
        <npa>true</npa>
    </configuration>
    <executions>
       <execution>
            <goals>
                <goal>xjc</goal>
            </goals>
       </execution>
    </executions>
</plugin>

是否可以使用具有特殊配置的剧集或某种可以用来解决此问题的绑定来解决此问题?

【问题讨论】:

    标签: java maven jaxb xsd xjc


    【解决方案1】:

    不幸的是,这是对剧集失败原因的解释,而不是您问题的答案。

    您可以使用jaxb:class/@ref 绑定将您的模式类型映射到某个现有类。请参阅 Blaise 的 this post

    简而言之,您可以执行以下操作:

    <jaxb:binding node="...point to your type here">
        <jaxb:class ref="ExistingClass"/>
    <jaxb:binding>
    

    在这种情况下,ExistingClass 将被重用于您的类型。

    您正在尝试使其与剧集一起使用。 Episode,本质上就是一组这样的映射。但是剧集使用 SCD(模式组件指示符)指向类型,而不是 node 和 XPath-Expressions。 SCD 是命名空间驱动的。如果你没有命名空间——或者,更好的说法——你有chameleon namespace design,那么你就没有正确的命名空间。因此剧集失败。

    问题是你的“通用”类应该使用“宿主”模式的命名空间(这就是变色龙设计的意义所在)。命名空间和本地名称实际上是在注释中提供的。如果您只有一组类和一组注释 - 那么您只有一个命名空间。所以目前我没有看到一个简单的方法来拥有一组“通用”类。

    如果您可以分别使用AB,也就是说,不能同时在同一个上下文中,那么就有可能欺骗注解阅读器为common 使用指定的命名空间。

    但是如果你想同时使用A和B,我真的不知道该怎么做。也许你可以为common 发明一个命名空间,然后应用一些预处理来用这个命名空间替换 A 和 B 中常见元素的命名空间......

    所以这不是一个答案,更多的是对背景的阐述。

    【讨论】:

    • 感谢您的回复。不幸的是,我在相同的上下文中使用它们。或者更好:我编写了一个类,它使用包 A 中的 JAXB 类来生成 JAXB 对象并在之后对其进行编组。 B 也需要这样做。所以我必须在复制和粘贴我为 A 编写的类之间进行选择,然后更改导入或更改类以根据触发器从某种工厂获取实际的 JAXB 对象实例说我是想使用 A 还是 B 的类。但我不确定这是否可行。
    • @padde 好吧,变色龙设计不是好的设计。祝你好运。如果您找到好的解决方案,请告诉我们。
    • 是的,我可以看到。维护者说它更易于阅读和编辑,尤其是当 JAXB 完成后,我也可以理解。我们将不得不看看妥协会是什么。希望其他人有一个聪明的主意。
    • 目前我们的 XML 文档是直接编辑和审查的。那里有另一个命名空间和前缀有时会使它变得更加困难,特别是对于不太了解如何的人。 JAXB 还增加了配置文件的阅读难度。我们正在将此文件的创建和编辑切换为仅由我们的应用程序完成,但在此之前我们将不得不考虑到这一点。
    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    相关资源
    最近更新 更多