JAXB输入和重复类型中的多个XSD

时间:2014-11-24 12:33:41

标签: java xml maven jaxb xsd

我正在尝试使用JAXB为两个XSD生成Java代码(让我们说request.xsd和response.xsd)

Request.xsd包括定义复杂类型的A.xsd" FOO"

Response.xsd包括B.xsd,它定义了一个复杂类型" FOO"也是(具有相同名称的不同类型)。

最初,我想为两个XSD添加一些类似于修复名称冲突的东西。

<xsd:annotation>
   <xsd:appinfo>
      <jaxb:class name="AFOO"/> (and BFOO)
   </xsd:appinfo>
</xsd:annotation>

然而,我仍然得到错误&#34; FOO&#34;已定义。如果我尝试仅为request.xsd生成代码或仅为response.xsd生成代码,则会正确生成代码。

我的初始pom.xml看起来像:

   <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.8.2</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <debug>true</debug>
                <schemaDirectory>src/main/resources/xsds</schemaDirectory> 
                <generateDirectory>src/main/generated</generateDirectory>
                <generatePackage>com.mycompany.generated</generatePackage> 
                <extension>true</extension>
                <markGenerated>true</markGenerated>
                <args>
                    <arg>-camelcase-always</arg>
                    <arg>-XtoString</arg>
                    <arg>-Xequals</arg>
                    <arg>-XhashCode</arg>
                    <arg>-Xsetters</arg>
                </args>
                <plugins>
                    <plugin>
                        <groupId>org.jvnet.jaxb2_commons</groupId>
                        <artifactId>jaxb2-basics</artifactId>
                        <version>0.6.4</version>
                    </plugin>
                    <plugin>
                        <groupId>org.andromda.thirdparty.jaxb2_commons</groupId>
                        <artifactId>camelcase-always</artifactId>
                        <version>1.0</version>
                    </plugin>
                </plugins>
            </configuration>
        </plugin>

最终,我设法使用不同的执行来处理请求和响应。

<executions>
                    <execution>
                        <id>Output</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <forceRegenerate>true</forceRegenerate>
                            <debug>true</debug>
                            <schemaDirectory>src/main/resources/xsds</schemaDirectory> 
                            <generateDirectory>src/main/generated</generateDirectory>
                            <schemaIncludes>
                                <include>
                            response.xsd
                                </include>
                            </schemaIncludes> 
                            <generatePackage>com.mycompany.generated.reply</generatePackage>
                            ....
                        </configuration>
                    </execution>

                    <execution>
                        <id>Input</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>

                        <configuration>
                            <forceRegenerate>true</forceRegenerate>
                            <debug>true</debug>
                            <schemaDirectory>src/main/resources/xsds</schemaDirectory> 
                            <generateDirectory>src/main/generated</generateDirectory>
                            <schemaIncludes>
                                <include>
                            request.xsd
                                </include>
                            </schemaIncludes> 
                            <generatePackage>com.mycopnay.generated.query</generatePackage>
                            ...
                        </configuration>
                    </execution>
                </executions>

通过这种方式,它可以工作。但是我有以下问题:

  • 有没有更好的方法让它在不修改xsd的情况下工作?请求和响应之间共享很多类,生成两次(在不同的java包下)。有没有办法重复使用它们?
  • 为什么覆盖班级名称(我的初始解决方案)不起作用?

2 个答案:

答案 0 :(得分:3)

  
    

A.xsd和B.xsd是否有不同的命名空间?

  
     

不,他们没有。

这就是原因。您无法自定义它,因为冲突不是在Java代码中而是在模式中。您具有相同名称的不同架构组件,您无法将其编译为一个。

  • 编译两次执行
  • 或者让他们成为一个(正如David Rabinowitz建议的那样)
  • 或者将它们放在不同的名称空间

一些提示:

  • 您的设计似乎朝chameleon schema design方向发展。一定要避免它。
  • 在使用多次执行进行编译时,请为每次执行指定不同的generateDirectory,请参阅this discussion

免责声明:我是maven-jaxb2-plugin的作者。

答案 1 :(得分:2)

你控制的是XSD吗?如果是这样,请定义common.xsd并从两个XSD导入。通过这种方式,您只需定义一次FOO。