4

我正在开发一个使用从供应商处获得的 wsdl 的实现。我们的项目在 Spring 和 CXF 上运行,我想创建一个 jar 以允许我访问该供应商的 wsdl 服务,但我遇到了类路径问题。

使用 CXF 的 wsdl2java 我可以生成如下代码:

WSDL_LOCATION = new URL("file:SomeService.wsdl");

该服务要求 wsdl 位于类路径中,但我想将它捆绑在 jar 中,以便它可以作为独立 jar 分发。使用 wsdl2java 工具,我可以将 URL 实例化中的字符串指定为我想要的任何内容。但是,我还没有在 jar 中找到自定义字符串和 wsdl 文件位置的组合。

我让它按我想要的方式工作的唯一方法是将 wsdl 文件放在 SomeService.class 所在的同一文件夹中,并使用以下行:

WSDL_LOCATION = TrackService.class.getResource("TrackService_v4.wsdl");

但是,这样做的缺点是我必须手动编辑 java 代码并自己编译。这是不可取的,因为我们最终希望将此过程作为 maven 构建的一部分,并让 wsdl2java 自己自动生成和编译。

我可以将 wsdl 放在 jar 中的任何位置,但我不知道将什么传递给 wsdl2java 以让它引用 jar 中的文件。

有没有人有任何建议或经验这样做?

4

3 回答 3

3

我遇到了同样的问题 - 我有以下解决方法,但我仍在寻找更清洁的东西。

  1. 将您的 wsdls 保存在 src/main/resources/wsdl

  2. 创建 TrackService 时执行以下操作:

    URL wsdlUrl = TrackService.class.getResource("/wsdl/TrackService_v4.wsdl"); TrackService 服务 = 新的 TrackService(wsdlUrl);

理想的解决方案是将位置作为<wsdlLocation/>元素传递到 CXF wsdl2java 插件中。然后您的客户端代码可以调用默认构造函数。但是,生成的存根代码不允许您指定类路径上的 wsdl 文件。

于 2011-02-25T14:46:00.227 回答
3

您需要按如下方式指定类路径 wsdl 位置,以生成使用 ClassLoader 将此 wsdl 加载为类路径资源的存根:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>2.4.3</version>
    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-bindings-soap</artifactId>
            <version>2.4.3</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${project.build.directory}/generated-sources/cxf
                </sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/yourWSDL.wsdl</wsdl>
                        <extraargs>
                            <extraarg>**-wsdlLocation**</extraarg>
                            <extraarg>**classpath:yourWSDL.wsdl**</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>
于 2012-10-24T10:11:30.510 回答
2

CXF 文档以同样的方式解决它:

 URL wsdl = getClass().getResource("wsdl/greeting.wsdl");
 SOAPService service = new SOAPService(wsdl, serviceName);

提供的另一个选项是 JaxWsProxyFactoryBean:

JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
proxyFactory.setServiceClass(MyService.class);
proxyFactory.setWsdlLocation("/wsdl/MyService.wsdl");

如果您还需要调整端点 URL,则可以添加:

proxyFactory.setAddress("http://192.168.0.2:6666/");
于 2013-04-10T08:16:04.280 回答