【发布时间】: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.xsd和B.xsd有不同的命名空间吗?