“无法初始化默认的wsdl ......” - 为什么?

时间:2013-11-22 20:51:06

标签: wsdl cxf pom.xml wsdl2java

我的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>

项目构建正常,没有任何错误或警告,我可以在myclient.wsdl文件夹下的JAR文件中看到文件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)端口).getRequestContext()。put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,“http://example.com/ ....”)来设置地址。< / LI>
  2. 将WSDL作为Java资源加载pass its location into your service's constructor
  3. 但是我更感兴趣的是一个解决方案,需要在pom.xml中输入正确的值,就像classpath approach一样(但遗憾的是,由于某些原因,类路径对我不起作用)。

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

2 个答案:

答案 0 :(得分:4)

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

<wsdlLocation>myclient.wsdl</wsdlLocation>

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

BTW:如果省略参数&lt; wsdlLocation&gt; param&lt; wsdl&gt;的值使用(在您的情况下在运行时不正确,但如果提供的URL是远程URL地址,即直接从Web服务服务器获取),则会更正。

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

答案 1 :(得分:1)

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

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

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

提示:

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