4

我有以下目录结构

Root
   CommonSchema
      1.xsd
      2.xsd

   Service1
      XSD
        3.xsd ( importing 1 and 2 xsd )
      WSDL
        A.wsdl ( importing 3.xsd )

   Service2
      XSD
        4.xsd ( importing 1 and 2 xsd )
      WSDL
        B.wsdl ( importing 4.xsd )

我正在尝试生成源代码并使用 XMLBeans+CXF 将它们编译到单个 jar 中。CommonSchema 文件夹包含由 Service1 和 2 共享的模式。

当我尝试生成源源时,似乎 1 和 2 xsd 的源有命名冲突,可以在下面看到:

第一代 WSDL

在此处输入图像描述

第二代 WSDL

在此处输入图像描述

关于我应该如何编译这个通用模式的任何想法?

这是我的蚂蚁脚本:

<target name="cxfWSDLToJava">
  <java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
    <arg value="-databinding"/>
    <arg value="xmlbeans"/>
    <arg value="-client"/>
    <arg value="-d"/>
    <arg value="cxfsrc"/>
    <arg value="D:\Generation\Services\CBS-CustAccountInfo-I\WSDL\CBS-CustAccountInfo-I-Concrete.wsdl"/>
    <classpath>
      <path refid="cxf.classpath"/>
    </classpath>
  </java>
</target>

<target name="cxfWSDLTXNToJava">
  <java classname="org.apache.cxf.tools.wsdlto.WSDLToJava" fork="true">
    <arg value="-databinding"/>
    <arg value="xmlbeans"/>
    <arg value="-client"/>
    <arg value="-d"/>
    <arg value="cxfsrc"/>
    <arg value="D:\Generation\Services\CBS-DirectDebCredTransfer-C\WSDL\CBS-DirectDebCredTransfer-C-Concrete.wsdl"/>
    <classpath>
      <path refid="cxf.classpath"/>
    </classpath>
  </java>
</target>

我的项目位于:CXF-Generation 下。

整个架构 + WSDL 可以在 CXF-Generation/Generation 下找到

4

2 回答 2

1

我不是蚂蚁专家,所以我不确定我是对的,但我认为问题在于一个目标超越了另一个。

运行 XmlBeans 命令时,如果您像 2 个单独的命令一样运行它:

wsdl2java -uri my_service1.wsdl
wsdl2java -uri my_service2.wsdl

第一个命令将生成一个 jar,第二个命令将使用来自第二个 wsdl 的新代码覆盖它。

我认为您正在像这样运行它,这就是为什么您只获得一个 wsdl 的代码。

您需要将它们组合成一个 wsdl(可能是包装器 wsdl),然后从中生成代码。

或者您可以生成 2 个不同的 jar。

编辑:

稍作修正,显然只有 IBM 支持从另一个 wsdl 导入 wsdl

所以包装器选项不在讨论范围内。恕我直言,这些是您的选择:

  1. 更改通用模式的目标命名空间,这样就不会发生冲突并生成 2 个 jar。
  2. 将两个 wsdl 合并为一个(简单的复制粘贴) - 如果存在具有不同用途的相同名称的方法/参数,可能会有点棘手。
于 2012-07-01T12:59:45.810 回答
0

使用 xsdconfig 解决我的问题。最后我复制了包,但它适合我的需要。

我的 Maven 生成冲突包

<executions>
<execution>
    <id>generate-sources</id>
    <phase>generate-sources</phase>
    <configuration>
        <wsdlOptions>
            <wsdlOption>
                <wsdl>${basedir}\..\Generation\Services\CBS-DirectDebCredTransfer-C\WSDL\CBS-DirectDebCredTransfer-C-Concrete.wsdl</wsdl>
                <extraargs>
                    <extraarg>-db</extraarg>
                    <extraarg>xmlbeans</extraarg>
                    <extraarg>-p</extraarg>
                    <extraarg>com.xxx.txnpos.ws</extraarg>
                </extraargs>
                <bindingFiles>
                    <bindingFile>${basedir}/txnpos.xsdconfig</bindingFile>
                </bindingFiles>
            </wsdlOption>
        </wsdlOptions>
    </configuration>
    <goals>
        <goal>wsdl2java</goal>
    </goals>
</execution>
</executions>

我的 xsd 配置:

<?xml version="1.0"?>
<xb:config xmlns:xb="http://xml.apache.org/xmlbeans/2004/02/xbean/config">
<xb:namespace uri="http://schemas.xxx.com/soa/emf/common/aggregates/">
<xb:package>com.xxx.schemas.soa.emf.txnpost.aggregates</xb:package>
</xb:namespace>
<xb:namespace uri="http://schemas.xxx.com/soa/emf/common/body/">
<xb:package>com.xxx.schemas.soa.emf.txnpost.body</xb:package>
</xb:namespace>
<xb:namespace uri="http://schemas.xxx.com/soa/emf/common/elements/">
<xb:package>com.xxx.schemas.soa.emf.txnpost.elements</xb:package>
</xb:namespace>
<xb:namespace uri="http://schemas.xxx.com/soa/emf/common/envelope/">
<xb:package>com.xxx.schemas.soa.emf.txnpost.envelope</xb:package>
</xb:namespace>
<xb:namespace uri="http://schemas.xxx.com/soa/emf/common/header/">
<xb:package>com.xxx.schemas.soa.emf.txnpost.header</xb:package>
</xb:namespace>
<xb:namespace uri="http://schemas.xxx.com/soa/emf/common/monetaryErrorReponse/">
<xb:package>com.xxx.schemas.soa.emf.txnpost.monetaryErrorReponse</xb:package>
</xb:namespace>
</xb:config>
于 2012-07-26T03:02:33.293 回答