簡體   English   中英

Eclipse RCP和Apache CXF

[英]Eclipse RCP and Apache CXF

我正在嘗試在Eclipse RCP應用程序中使用Apache CXF。 一個插件(X)將提供使用CXF的OSGI服務。 另一個插件(Y)將調用此服務。

“ X”插件使用我下載的CXF JAR(CXF 2.7.11),我將其添加到MANIFEST.MF。 當我從內部插件X運行測試用例時,一切正常,即,我可以調用Web服務並獲得響應。

當我嘗試運行插件“ Y”時,會看到我可以調用的OSGI服務。 OSGI服務從內部項目“ X”中調用與上述情況相同的代碼,但是現在不起作用。 我得到的異常是:

com.sun.xml.internal.ws.client.sei.SEIStub cannot be cast to org.apache.cxf.frontend.ClientProxy

在這一部分:

org.apache.cxf.endpoint.Client client = ClientProxy.getClient(myServicePort);

現在,當我在此插件(插件X)中運行SAME CODE時 ,它運行正常。

因此,我懷疑它與JAR和依賴關系等有關,但是我不確定。 我搜索了此異常,當CXF中缺少一些JAR時,就會出現此異常,但是將所有 JAR都添加到了我在CXF發行版中找到的MANIFEST.MF中。

我什至不確定我真正需要什么CXF類,但是測試用例似乎運行得很好。

任何想法出了什么問題?

我這樣設置客戶端:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(YourClass.class);
factory.setAddress(endpoint);
YourClass port = (YourClass) factory.create(); 
Client client = ClientProxy.getClient(port);

如果已經自動生成了Java,則將具有名為name_name_client.java和name_name12_client.java的客戶端類,而YourClass為name.java(此Java定義了WebMethods),因此請進行更改並設置端點。 試試看,讓我們知道它是否適合您。

我通常在創建Service和Port之前將ClassLoader切換到cxf插件。 創建端口后,我將上下文類加載器設置為原始類。 這種方法可確保使用了cxf插件的類加載器,並且加載了正確的客戶端類,因此您不會遇到強制轉換異常。

// to avoid class loader visibility issue
ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
try {
    Thread.currentThread().setContextClassLoader(ProviderImpl.class.getClassLoader());
    MyService ss = new MyService(wsdlURL, SERVICE_NAME);
    MyPort port = ss.getMyPort();
    Client client = ClientProxy.getClient(port);
    ...
} finally {
    Thread.currentThread().setContextClassLoader(classLoader);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM