gpt4 book ai didi

java - Apache CXF 中的可交换目标命名空间

转载 作者:行者123 更新时间:2023-11-30 04:09:39 27 4
gpt4 key购买 nike

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

为什么?每个客户都有自己的 wsdl 文件。

目前的情况是,有一个项目依赖于 serverX 上托管的 wsdl X。这意味着每个客户都需要使用特定的 wsdl URL 进行额外构建。wsdl 文件始终相同,只是服务器发生变化。

将构建一个 fat jar (jar-with-dependencies) 并将其上传到我们的 Nexus 服务器。

我们使用 Java 7 和 Maven 3 来构建我们的项目。

问题是部署到 Nexus 时,您无法更改部署的 Artifact 的名称。 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 服务呢?目前原项目使用了一个接口(interface)以及一个模型类。

<小时/>

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

最佳答案

我解决了。与此类似: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();

关于java - Apache CXF 中的可交换目标命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19955689/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com