【问题标题】:"Can not initialize the default wsdl from..." -- Why?“无法从...初始化默认 wsdl”——为什么?
【发布时间】:2013-12-07 21:17:53
【问题描述】:

我的pom.xml 包含以下内容,用于为具有以下指定 WSDL 的工作 Web 服务自动生成客户端:

        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <configuration>
                        <sourceRoot>${basedir}/target/generated/src/main/java</sourceRoot>
                        <wsdlOptions>
                            <wsdlOption>
                                <wsdl>${basedir}/src/main/wsdl/myclient.wsdl</wsdl>
                                <extraargs>
                                    <extraarg>-client</extraarg>
                                    <extraarg>-verbose</extraarg>
                                </extraargs>
                                <wsdlLocation>wsdl/myclient.wsdl</wsdlLocation>
                            </wsdlOption>
                        </wsdlOptions>
                    </configuration>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

项目构建良好,没有任何错误或警告,我可以在 wsdl 文件夹下的 JAR 文件中看到文件 myclient.wsdl

但是当我尝试运行那个 JAR 时:

  java -Xmx1028m -jar myclient-jar-with-dependencies.jar

它抱怨“无法从 wsdl/myclient.wsdl 初始化默认 wsdl”

为什么?

我错过了什么?

我如何找出在 pom.xml 中的wsdl/myclient.wsdl翻译成什么路径,这使得客户端的 JAR 在运行时抱怨?

更新:我知道一些涉及修改自动生成代码的解决方案/解决方法:

  1. 为 wsdl URL 传递“null”,然后使用 ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://example.com/....") 设置地址。
  2. 将 WSDL 加载为 Java 资源和pass its location into your service's constructor

但我对需要在pom.xml 中输入正确值的解决方案更感兴趣,例如classpath approach(但不幸的是,由于某种原因,类路径对我不起作用)。

有什么想法我应该在那里输入吗?显然,这是为该特定插件找出正确路径规则的一个非常简单的案例,但我遗漏了一些东西,我不知道它是什么。

【问题讨论】:

    标签: wsdl cxf pom.xml wsdl2java


    【解决方案1】:

    错误来自您生成的服务类的静态初始化程序(由@WebServiceClient 注释)。它尝试将 wsdl 文件加载为资源。生成器使用参数 wsdlLocation 提供的值。你应该去掉“wsdl/”前缀:

    <wsdlLocation>myclient.wsdl</wsdlLocation>
    

    因为 wsdl 直接位于类路径文件夹的根目录中。

    顺便说一句:如果您省略参数 ,则使用参数 的值(在您的情况下,这在运行时不正确,但如果提供的 URL 是远程 URL 地址,则正确,即直接从webservice服务器获取)。

    BTW2:您的解决方法 2 实际上是 +/- 如果您使用无参数构造函数,生成的服务类代码会做什么。

    【讨论】:

      【解决方案2】:

      我注意到cfx examplessourceRootwsdlwsdlLocation 使用的位置略有不同。

      请记住,src/main/resources 中的文件通常包含在生成的工件中。为了包含src/main/wsdl 中的文件,需要将其作为资源添加到 pom.xml 中:

      <resources>
          <resource>
              <directory>src/main/wsdl</directory>
          </resource>
      </resources>
      

      提示:

      • 将您怀疑的路径设置为已知的错误路径,看看您是否收到相同的错误消息。
      • 解压缩生成的*.jar-file(s) 并检查是否包含wsdl,以及路径是什么。

      【讨论】:

      • +1 并被接受,因为这正是我为解决问题所做的。但是,如何找出 pom.xml 中的 wsdl/myclient.wsdl 在运行时转换成什么路径对我来说仍然是一个谜?
      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多