我希望在Apache CXF生成的cade中动态交换webserive targetnamescpace(host)。
为什么呢?每个客户都有自己的wsdl文件。
目前的情况是,有一个项目依赖于托管在serverX上的wsdl X.这意味着每个客户都需要使用特定的wsdl URL进行额外构建。 wsdl文件总是相同的,只是服务器更改。
将构建一个胖jar(jar-with-dependencies)并上传到我们的nexus服务器。
我们使用Java 7和Maven 3来构建我们的项目。
问题是在部署到nexus时,您无法更改已部署的工件的名称更改。 application-1.0-CUSTOMER.jar将是一个很好的模式,但我没有找到解决方法,整个过程看起来也不是很干净。
webservice-.java文件由cxf-codegen-plugin插件生成。我正在使用此配置:
<!-- CXF wsdl2Java Generation -->
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.7.0</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated-sources/cxf/</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>
http://trunk. ....
</wsdl>
<serviceName>ServiceName</serviceName>
<extraargs>
<extraarg>-impl</extraarg>
<extraarg>-verbose</extraarg>
<!-- override the namespace to have always identical package names -->
<extraarg>-p</extraarg>
<extraarg>de.packagename.wsdl</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
这里有一个生成的java文件:
/**
* This class was generated by Apache CXF 2.7.0
* 2013-11-13T14:35:21.046+01:00
* Generated source version: 2.7.0
*
*/
@WebService(targetNamespace = "http://trunk...", name = "SomeName")
@XmlSeeAlso({ObjectFactory.class})
public interface SomeName {
...
}
我的想法是从该应用程序中删除整个Web服务 - 客户端实现并将其放入另一个项目(一个项目一个客户) - 但是如何从原始项目调用Web服务?目前,原始项目使用一个接口以及一个模型类。
我知道通过使用带有变量的工件版本来解决部署问题,但是非常不鼓励,至少在maven 3中。
答案 0 :(得分:2)
我解决了。 它类似于这个:How to create a CXF webservice client with dynamic endpoint?但是只有经过半天的调试才发现我的解决方案。
final QName qname = new QName(Settings.MAIN_SCAN_SERVICE_SOAP_URL.get().toString(), "PortName");
final String wsdlUrl = Settings.MAIN_SCAN_SERVICE_WSDL_URL.get().toString();
final JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
jaxWsProxyFactoryBean.setAddress(Settings.MAIN_SCAN_SERVICE_SOAP_URL.get().toString());
jaxWsProxyFactoryBean.setEndpointName(qname);
jaxWsProxyFactoryBean.setServiceName(new QName(wsdlUrl, "PortName"));
jaxWsProxyFactoryBean.setWsdlLocation(wsdlUrl);
jaxWsProxyFactoryBean.setServiceClass(PortImpl.class);
this.portImpl = (PortImpl) jaxWsProxyFactoryBean.create();