【问题标题】:Error while generating client from wsdl using apache cxf使用 apache cxf 从 wsdl 生成客户端时出错
【发布时间】:2012-10-23 11:06:11
【问题描述】:

我尝试通过给出以下命令,使用 cxf(版本 2.2.3、2.2.6 和 2.7.0)从 wsdl 生成存根和客户端

> wsdl2java.bat -p com.easynet.eordering.client -client  http://expediter.staging.gis.easynet.com:7001/cds/services/eordering?wsdl

但我收到一个错误

WSDLToJava 错误:非唯一的身体部位!在港口,操作必须 线路上具有独特的操作签名,以确保成功发送。在 端口 {http://eordering.uk.easynet.net}eorderingPortSOAP,操作 “{http://eordering.uk.easynet.net}getAMList”和 "{http://eordering.uk.easynet.net}getDCList" 有同样的请求 正文块 {http://eordering.uk.easynet.net}userListRequest

我知道为什么会抛出这个错误,在我的wsdl操作中写成

<operation name="getDCList"><input message="tns:userListRequest"/><output message="tns:userListResponse"/></operation>
<operation name="getAMList"><input message="tns:userListRequest"/><output message="tns:userListResponse"/></operation>

我只是为这两个操作重用了 userListRequest 参数,我相信由于两个操作中指定了相同的参数(userListRequest)而引发了错误。

有什么方法可以避免这个错误而不改变 wsdl 吗? (据我所知,wsdl 1.2 不允许操作重载,但输入参数重载?)。

【问题讨论】:

    标签: java wsdl cxf


    【解决方案1】:

    这样的 WSDL 不符合 WSI-BasicProfile。见:

    http://www.ws-i.org/profiles/basicprofile-1.1.html#Operation_Signatures

    配置文件将操作签名定义为将出现在 soap:Body 中的元素的名称。因此,如果两个操作使用相同的子元素(或您的情况下的消息),则它们被视为非唯一且违反:

    R2710 The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another.
    

    【讨论】:

    • 感谢提供的链接,我是这么认为的,但为了避免错误而不更改 wsdl 参数:-),现在将更改签名。
    【解决方案2】:

    如问题中所述:

    有什么方法可以避免这个错误而不改变 wsdl 吗?

    如果您无法修复 WSDL,您可以禁用其验证:

    -验证=无

    或者如果您使用的是 Maven:

    <configuration>
        <wsdlOptions>
            <wsdlOption>
                <wsdl>${basedir}/src/main/wsdl/my.wsdl</wsdl>
                <validate>none</validate>
            </wsdlOption>
        </wsdlOptions>
    </configuration>
    

    不确定这是否不会在运行时引起问题。我会很快找到这个并更新这篇文章。

    【讨论】:

    • 如果您无法控制 wsdl,那么您将无法修复它。我的项目已经开发了几个月,到目前为止我还没有发现任何缺点。
    • 为给出的解释移除了 -1
    • 很多时候您必须使用第三方的 wsdl。它不是更正 wsdl 的选项。
    • 来自用户3475860 的评论在answer 中错误发布关闭验证后,运行时会发生什么情况?您是否从 WSDL 文件中获取类,因为我遇到了同样的问题!请如果您已经解决了这个问题,请告诉我该怎么办?
    【解决方案3】:

    如果可以更改 WSDL 并且使用 WS-I Basic Profile 2.0,您可以将 wsa:Actionunique value 添加到元素 wsdl:input(在元素 wsdl:operation 内):

    例如

    <wsdl:operation name="update">
      <wsdl:input message="tns:myMessage" wsam:Action="namespace/port/operation" />
    </wsdl:operation>
    

    在 WS-I Basic Profile 2.0 中“操作签名”的定义: “配置文件将“操作签名”定义为 SOAP 输入消息的 SOAP 主体的子元素的完全限定名称,由 WSDL 绑定中的操作和 wsa:Action SOAP 标头块的 URI 值(如果存在)描述。”

    【讨论】:

      【解决方案4】:

      另一种解决方法是尝试从 WSDL 获取架构文件。和下面的插件在maven中生成java类

      <plugin>
          <groupId>org.jvnet.jax-ws-commons</groupId>
          <artifactId>jaxws-maven-plugin</artifactId>
          <version>2.3</version>
          <executions>
              <execution>
                  <id>schema1-generate</id>
                  <goals>
                      <goal>wsimport</goal>
                  </goals>
                  <configuration>
                      <extension>true</extension>
                      <bindingFiles>
                          <bindingFile>${basedir}/src/main/resources/wsdl/service-bindings.xjc</bindingFile>
                      </bindingFiles>
                      <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
                      <wsdlFiles>
                          <wsdlFile>Service.wsdl</wsdlFile>
                      </wsdlFiles>
                      <keep>true</keep>
                      <sourceDestDir>target/generated-code/src</sourceDestDir>
                      <vmArgs>
                          <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
                      </vmArgs>
                  </configuration>
                  <phase>generate-sources</phase>
              </execution>
          </executions>
      </plugin>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        相关资源
        最近更新 更多