【问题标题】:JAXB multiple XSDs in input and duplicate types [duplicate]输入和重复类型中的 JAXB 多个 XSD [重复]
【发布时间】:2015-01-22 04:10:31
【问题描述】:

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

Request.xsd 包含定义复杂类型“FOO”的 A.xsd

Response.xsd 包括 B.xsd,它也定义了一个复杂类型“FOO”(不同类型同名)。

最初,我想在两个 XSD 中添加类似的东西来解决名称冲突。

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

但是,我仍然收到“FOO”已定义的错误。如果我尝试仅为 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包下)。有没有办法重复使用它们?
  • 为什么覆盖类名(我的初始解决方案)不起作用?

【问题讨论】:

  • A.xsdB.xsd 有不同的命名空间吗?

标签: java xml maven jaxb xsd


【解决方案1】:

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

不,他们没有。

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

  • 在两次执行中编译
  • 或者将它们合二为一(如 David Rabinowitz 建议的那样)
  • 或者将它们放在不同的命名空间中

一些提示:

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

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

【讨论】:

  • 感谢您的回复。我目前正在使用旧版 XSD。我正在尝试使用 jaxb,因为我认为这是朝着正确方向迈出的一步,而不是手动编写容器,但我想尽量减少对 XSD 的修改。
  • 目前,插件是否有一些新选项可以自动创建不同的目录(或包)或绕过“已定义”类型? @lexicore
  • @s1moner3d 不确定您所说的“自动化”是什么意思。 “已经定义的类型”是模式中的一个问题。该插件无法为您修复它。
  • @lexicore 阅读日志,插件似乎从工作区目录开始搜索 xsd,即使我在源路径前加上 ${project.basedir} 如何让它对待它是绝对路径吗?
【解决方案2】:

它是你控制的 XSD 吗?如果是这样,请定义一个 common.xsd 并从两个 XSD 导入。这样,您将只定义一次 FOO。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2011-06-11
    • 2014-09-04
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多