我正在尝试使用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>
通过这种方式,它可以工作。但是我有以下问题:
答案 0 :(得分:3)
A.xsd和B.xsd是否有不同的命名空间?
不,他们没有。
这就是原因。您无法自定义它,因为冲突不是在Java代码中而是在模式中。您具有相同名称的不同架构组件,您无法将其编译为一个。
一些提示:
generateDirectory
,请参阅this discussion。免责声明:我是maven-jaxb2-plugin的作者。
答案 1 :(得分:2)
你控制的是XSD吗?如果是这样,请定义common.xsd并从两个XSD导入。通过这种方式,您只需定义一次FOO。