2012-07-11 75 views
2

我想用我的REST客戶端,用CXF開發,用TomEE/TomEE + 1.0,但是我對JAXB JSON編組/解組(使用Jackson庫)有一點問題。 我都嘗試Jersey客戶端1.1.13和CXF Web客戶端(包含Tomee + 1.0版本),但是,我有在部署時相同的錯誤:如何在TomEE中編寫基於CXF的REST客戶端?

org.apache.openejb.OpenEJBException:沒有可用的資源 - 供應商ref'null'類型'javax.ws.rs.ext.Providers'爲'localhost/mywebapp.Comp'

我試着複製'jackson-jaxrs-json-provieder-2.0.4.jar' jar到TomEE lib目錄,但錯誤是一樣的。 我也嘗試將系統屬性'openejb.cxf.jax-rs.providers'設置爲'com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider,com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider',但沒有任何改變。

下面是代碼的示例中,我使用,使與CXF REST調用:

final List<Object> providers = new ArrayList<Object>(); 
providers.add(new JacksonJaxbJsonProvider()); 
WebClient wc = WebClient.create(url, providers); 

反正這個代碼它從來沒有執行,因爲錯誤是在部署時。 我的webapp(使用Jersey Client開發的版本)適用於Glassfish 3.1.2。

問題在哪裏?

謝謝,再見 , 傑米斯

回答

1

我發現了一個很好的臨時解決方案,使用CXEE休息客戶端以及Jackson JSON編組與TomEE + 1.0.0。 我從移動web應用程序的lib這些庫的TomEE lib目錄:

  • 傑克遜的註解-2.0.4.jar
  • 傑克遜JAXRS-JSON-提供商2.0.4.jar
  • 傑克遜-module-JAXB的註釋-2.0.4.jar
  • 傑克遜核心-2.0.4.jar
  • 傑克遜 - 數據綁定-2.0.4.jar

這是我的代碼,以使一個休息電話:

final ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 
objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false); 
objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true); 
objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false); 
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, true); 
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 

final JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS); 
provider.setAnnotationsToUse(JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS); 
provider.setMapper(objectMapper); 

final List<Object> providers = new ArrayList<Object>(); 
providers.add(provider); 

WebClient wc = WebClient.create(_request.getUrl(), providers); 
wc = wc.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON); 

try { 
    res = (ElasticResponse) wc.invoke(_request.getHttpVerb(), _request.getMessage(), _request.getElasticResponseClass()); 
} catch (final ServerWebApplicationException _e) { 
    this._log.log(Level.FINE, "http response code > 400", _e); 
} 

我希望與TomEE的下一個版本,我不需要向傑克遜的庫添加到容器中,但只對Web應用程序。

3

發現並修正了這個bug:

試用最新TomEE snapshot

我使用jacskon(是需要添加罐子和要設置的提供程序),它的工作原理。

+0

嗨,謝謝你的支持。 我希望很快會有最終版本的TomEE 1.1,但我會在生產環境中使用穩定版本。 – 2012-07-25 09:47:05