2012-09-03 30 views
5

我需要將REST客戶端集成到使用Apache Felix實現的現有OSGi應用程序中。 REST服務基於JAX-RS的RESTeasy實現(版本2.3.2.Final)。我創建了一個包含客戶端依賴項的獨立包,導出了所需的RESTeasy包並將它們導入到使用該客戶端的包中,但不幸的是我無法在OSGi上下文中使用它。OSGi應用程序中的REST客戶端

我嘗試了兩種不同的方法。第一個使用通用的ClientRequest:

ClientRequest request = new ClientRequest(MyService.URL_TEST+"/stats"); 
request.body(javax.ws.rs.core.MediaType.APPLICATION_XML, stats); 
ClientResponse<String> response = request.post(String.class); 

的錯誤,我在這種情況下得到的是很奇怪:

[java] java.lang.RuntimeException: java.lang.ClassCastException: 
org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor cannot be cast to 
org.jboss.resteasy.client.ClientExecutor 

,我這是爲確保ApacheHttpClient4Executor實現ClientExecutor接口知。

當我試圖用我自己的REST客戶端來包裹RestEasy的是這樣的:

MyService myService = MyServiceClient.getInstance(); 
myService.saveStatistics(stats); 

我得到一個不同的異常:

[java] java.lang.LinkageError: ClassCastException: attempting to 
castjar:file:/D:/Development/Eclipses/eclipse_4.2_j2ee_x64/lib/jaxrs-api-2.3.2.Final.jar 
!/javax/ws/rs/ext/RuntimeDelegate.classtobundle: 
//78.0:1/javax/ws/rs/ext/RuntimeDelegate.class 

據我瞭解,該LinkageError類最有可能有與RESTeasy使用一些類加載器技巧來初始化RuntimeDelegate的方式有關,這些技巧可能屬於OSGi框架的限制。我懷疑前面提到的java.lang.ClassCastException具有相同的來源。

有什麼辦法讓RESTeasy在OSGi內部工作嗎?

PS:關於與RestEasy的類似問題的討論,但OSGi的以外:java.lang.LinkageError: ClassCastException

更新: 這些都是納入RESTClient實現捆綁: 激活1.1.jar公地codec- 1.2.jar commons-httpclient-3.1.jar commons-io-2.1.jar commons-logging-1.0.4.jar flexjson-2.1.jar httpclient-4.1.2.jar httpcore-4.1.2.jar javassist-3.12.1 .GA.jar jaxb-api-2.2.3.jar jaxb-impl-2.2.4.jar jaxrs-api-2.3.2.Final.jar jcip-annotations-1.0.jar jettison-1.3.1.jar jsr250-api -1.0.jar junit-4.10.jar log4j-1.2.14.jar resteasy-jaxb-provider-2.3.2.Final.jar resteasy-jaxrs- 2.3.2.Final.jar resteasy-jettison-provider-2.3.2.Final.jar scannotation-1.0.3.jar slf4j-api-1.6.4.jar slf4j-log4j12-1.6.4.jar myservice-common-0.1 .0.3.jar my-service-client-0.1.0.3-SNAPSHOT.jar stax-api-1.0-2.jar xmlpull-1.1.3.1.jar xpp3_min-1.1.4c.jar xstream-1.4.2.jar

這些是從restclient bundle導出:javax.ws.rs,javax.ws.rs.ext,javax.ws.rs.core,org.jboss.resteasy.client,org.jboss.resteasy.client。緩存,org.jboss.resteasy.client.extractors,org.jboss.resteasy.client.marshallers,org.jboss.resteasy.client.core.executors,javax.xml.bind.annotation,org.jboss.resteasy.plugins。提供商,org.jboss.resteasy.plugins.providers.jaxb,org.jboss.resteasy.spi

+0

您的客戶端軟件包中包含哪些罐子? – jtahlborn

+0

那些至今:爲MyService客戶端 - 0.1.0.3-SNAPSHOT.jar 爲MyService,共0.1.0.3.jar 的JUnit 4.10.jar 了Javassist-3.12.1.GA.jar jcip的註解-1.0.jar JSR250的API-1.0.jar RestEasy的-JAXRS-2.3.2.Final.jar JAXRS-API 2.3.2.Final.jar 激活1.1.jar 公地httpclient的-3.1.jar –

+0

和內我的restclient包我試圖導出javax.ws.rs, javax.ws.rs.ext, javax.ws.rs.core, org.jboss.resteasy.client, org.jboss.resteasy.client.core .executors除了我自己的類myservice-common –

回答

0

看看SpringSource Bundle Repo,它有一些非常有用的預構建的通用庫,包括我們正在使用的Apache HTTP Client(與gson一起使用)來完成我們的RESTful通信。

+0

感謝您的提示。在提問並且剛剛再次檢查時,我一直在那裏 - 不幸的是沒有RESTeasy包。事實上,RESTeasy在使用代理時在運行時按名稱使用了一些類加載。這導致了同一類的兩個版本 - 一個由OSGi上下文加載,另一個由RESTeasy本身加載。 –

0

(不幸的是,我項目的遺留模塊仍然使用OSGi,但使用RESTeasy 3.0。16現在)

當我需要OSGify依賴項時,我現在首選的解決方案是使用優秀的Apache Ops4j Pax Tipi project來包裝它。

該項目提供了一個預配置的Maven設置(父POM處理捆綁),並且您只需將Tipi子模塊中原始項目的GAV座標與org.apache.ops4j.pax.tipi前綴相匹配,然後構建新的捆綁項目,原始依賴關係,解包並將其封裝爲OSGi包。

您可以從一個與您的項目設置(依賴性等)最匹配的現有Tipi子項目開始,並調整任何OSGi導入/導出缺失(通常,這些由maven-bundle-plugin自動創建) 。

只要原始項目不包含太多異乎尋常的或畸形的依賴關係,這對我來說工作得非常好。

但是,您可能會碰到像transitive dependencies using the root package這樣的障礙,就像我目前所遇到的那樣,這可能是一個真正的展示塞(找出哪個庫是真正的噩夢)。

不幸的是,RestEasy的似乎受此影響,因爲我得到完全相同的錯誤(默認的包,甚至宣稱非測試和未設置的依賴關係可選後:

默認包」。 「不是由進口包裝語法允許

升級Maven的捆插件到最新版本3.0.1產生不同的錯誤(甚至更少有用):

[錯誤]包org.ops4j.pax.tipi:org.ops4j.pax.tipi.resteasy-jaxrs:bundle:3.0.16.Final.1:無法從包本機代碼頭解析名稱: [錯誤]錯誤發現(S)的束配置

更新似乎是正在增加在POM踢被版本1.4.0,測試得到解決......

0

是強制性的RESTEasy? 我個人在OSGi中使用jersey,它在客戶端和服務器端都能正常工作。