2015-10-29 43 views
0

我試圖使用Olingo提供與OData服務(也寫在Olingo中)交互的客戶端。我正在嘗試發送PATCH。但是,標準驗證例程正在踢腳板,如果我不包含使用標準Olingo工具標記爲不可空的實體元素,則會出現錯誤。使用Olingo v2 Java作爲PATCH到OData v2服務的客戶端

https://olingo.apache.org/doc/odata2/tutorials/OlingoV2BasicClientSample.html它說:

隨着HTTP MERGE/PATCH,也可以只發送更新的數據作爲POST身體和省略未改變的數據。但是這個(目前)在這個示例中沒有顯示。

不幸的是我不知道如何做到這一點,在那裏,似乎沒有是標誌的EntityProvider.writeEntry方法,這是一個補丁不是任何地方POST/PUT

EntityProviderWriteProperties properties = EntityProviderWriteProperties 
      .serviceRoot(rootUri).omitJsonWrapper(true).contentOnly(true) 
      .build(); 

     // serialize data into ODataResponse object 
     ODataResponse response = EntityProvider.writeEntry(contentType, 
       entitySet, data, properties); 

在我的代碼的這一點上,如果「數據」不包含我的非空字段的條目,我會得到一個錯誤。該響應還會爲不在我的「數據」中的實體的所有屬性返回空值。

我處理這個問題的方法是在「標準」代後刪除所有不在我的「數據」中的條目,但想象一下,即使我看不到它,也必須有更好的方法。有關如何處理這個問題的任何建議?

回答

3

您必須創建一個「ExpandSelectTreeNode」,其中只包含要序列化的選定屬性的名稱。 假設你的數據與值的HashMap中您可以使用下面的代碼作爲一個例子,從開始:

// data = new HashMap<>(); 
ExpandSelectTreeNode node = ExpandSelectTreeNode.entitySet(entitySet) 
    .selectedProperties(new ArrayList<String>(data.keySet())).build(); 

EntityProviderWriteProperties properties = EntityProviderWriteProperties 
      .serviceRoot(rootUri).omitJsonWrapper(true).contentOnly(true) 
      .expandSelectTree(node) 
      .build(); 

// serialize data into ODataResponse object 
ODataResponse response = EntityProvider.writeEntry(contentType, 
     entitySet, data, properties); 

問候

+0

完美的工作,比我正在做的後JSON製作操作更好得多。謝謝。希望我能夠在Olingo doco中找到它。 –

0

從客戶端應用程序/ JSON-補丁+ JSON將contentType?

+0

否客戶端發送的有效內容的內容類型始終是用於Json文檔的OData V2中的「application/json」。 – chrisam