我正在开发一个实现,它将使用我从供应商处获得的wsdl。我们的项目在Spring和CXF上运行,我想创建一个允许我访问这个供应商的wsdl服务的jar,但是我遇到了类路径问题。
使用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中的文件。
有人有任何建议或经验吗?
答案 0 :(得分:3)
您需要按如下方式指定classpath 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>
答案 1 :(得分:2)
我遇到了同样的问题 - 我有以下解决方法,但我仍在寻找更清洁的东西。
将您的wsdls保存在src / main / resources / wsdl
创建TrackService时执行以下操作:
URL wsdlUrl = TrackService.class.getResource(“/ wsdl /TrackService_v4.wsdl”); TrackService服务=新的TrackService(wsdlUrl);
理想的解决方案是将位置作为<wsdlLocation/>
元素传递到CXF wsdl2java插件中。然后您的客户端代码可以调用默认构造函数。但是,生成的存根代码不允许您指定类路径上的wsdl文件。
答案 2 :(得分:2)
The CXF Documentation以同样的方式解决它:
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");
如果您还需要调整端点网址,则可以添加:
proxyFactory.setAddress("http://192.168.0.2:6666/");