1

Apache CXF によって生成された cade で webserive targetnamescpace (ホスト) を動的に交換したい。

なんで?各顧客には独自の wsdl ファイルがあります。

現在の状況では、serverX でホストされている wsdl X に依存するプロジェクトが 1 つあります。つまり、顧客ごとに、特定の 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 ファイルの 1 つを次に示します。

/**
 * 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 実装全体を切り取り、それを別のプロジェクト (1 つのプロジェクト、1 つの顧客) に配置することでしたが、元のプロジェクトから webservice を呼び出す方法は? 現在、1 つのインターフェイスが元のプロジェクトと 1 つのモデル クラスで使用されています。


アーティファクト バージョンと変数を使用することで展開の問題を回避するハックがあることは知っていますが、少なくとも 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 に答える