Apache CXF中的可交换目标名称空间

时间:2013-11-13 13:57:54

标签: java web-services maven soap wsdl

我希望在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中。

1 个答案:

答案 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();