1

我想在 Apache CXF 生成的 cade 中动态交换 webserive targetnamescpace(主机)。

为什么?每个客户都有自己的 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 {
...
}

我的想法是从该应用程序中删除整个 webservice-client 实现并将其放入另一个项目(一个项目一个客户) - 但是如何从原始项目调用 webservice?目前,原始项目使用一个接口以及一个模型类。


我知道通过使用带有变量的工件版本可以解决部署问题,但强烈建议不要这样做,至少在 maven 3 中是这样。

4

1 回答 1

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();
于 2013-11-14T15:50:42.280 回答