防止在没有名称空间的情况下从XSD生成重复的类

时间:2014-10-09 09:03:31

标签: java maven jaxb xsd xjc

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

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

这会产生以下问题:对于此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>

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

1 个答案:

答案 0 :(得分:2)

这解释了为什么剧集失败,遗憾的是,这不是你问题的答案。

您可以使用jaxb:class/@ref绑定将架构类型映射到某个现有类。见Blaise的this post

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

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

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

你正试图让它与剧集一起使用。第一集,实质上就是一组这样的映射。但剧集使用SCD(架构组件指示符)指向类型,而不是node与XPath表达式。 SCD是名称空间驱动的。如果您没有命名空间 - 或者更好的说 - 您拥有chameleon namespace design,那么您就没有正确的命名空间。因此剧集失败了。

问题在于你的常见&#34;类应该使用&#34; host&#34;的名称空间。架构(这是变色龙设计的意义)。实际上,注释中提供了命名空间和本地名称。如果您只有一组类和一组注释 - 那么您只有一个名称空间。所以目前我还没有看到一个简单的方法,只有一套&#34;普通&#34;类。

如果您可以单独使用AB,也就是说,同时不在同一个上下文中,则可以欺骗注释阅读器使用指定的命名空间{ {1}}。

但如果你想同时使用A和B,我真的不知道该怎么做。也许您可以为common创建一个名称空间,然后应用一些预处理来替换此命名空间中A和B中的公共元素的名称空间......

所以这不是一个答案,而是对背景的详细阐述。