2016-01-20 86 views
0

我有一個Spring Data Rest項目,它揭示了由JPA和hibernate管理的實體。 我使用多個PATCH請求更新實體中的多個多對多關係。多個PATCH請求REST結束點

因此,我發送PATCH請求到終點,實體URL列表作爲每個多對多關係的主體。

貼劑請求發生同時這樣一個請求被進行,並且所述第二併發請求給出

行被另一事務更新或刪除(或者未保存值的映射是不正確的)

有方式要同時修補實體? 實施例實體是等,

User { 

List<Role> roles; 

List<Module> modules; 

} 

併發補丁的請求發生在兩個角色和模塊。
編輯:這是我用來修補的角碼。

var patchRequests = []; 
    angular.forEach(copy, function (value, property) { 
        if (angular.isArray(copy[property])) { 
         // If array contains more than zero elements 
         if (copy[property].length > 0) { 
          patchRequests.push(
           $http.patch(url,copy[property].join('\n'), { 
            headers: { 
             'Content-type': 'text/uri-list' 
            } 
           })); 
         } 
        } 
       }); 
    $q.all(patchRequests); 

'複製' 對象是像波紋管

{"roles":["http://localhost:9002/api/roles/1","http://localhost:9002/api/roles/3"],"modules":["http://localhost:9002/api/modules/1"],"subModules":[],"userName":"hrandika","password":"password","email":"[email protected]","activated":true} 

編輯2: 春天數據剩下的只是一個接口

@Repository 
public interface UserRepository extends PagingAndSortingRepository<User, Long>{ 

} 
+0

向我們展示您在打補丁的地方的代碼。 –

+0

@RobertMoskal我添加了AngularJS代碼和我用來修補的對象。簡單地說,我遍歷對象屬性,選擇數組,如果數組長度大於0,則發送PATCH。 –

+0

這是我認爲我們需要看到的服務器端點。 –

回答

1

按照HTTP Patch規格:

服務器必須以原子方式應用整組變更,並且從不提供(例如,響應於此操作期間的GET)部分修改的表示。如果整個補丁文件 無法成功應用,則服務器不得應用任何 更改。

單個修補程序請求所做的所有更改都必須是原子的。這是通過使用容器或數據庫管理事務在Java中實現的。

因此,如果兩個客戶端將修補程序發送到服務器,則其中一個客戶端必須等到第一個客戶端完成其工作或失敗。由於修補程序可以更新任何字段(甚至其他資源),因此兩個單獨的修補程序請求可能會不同地更新相同的字段(類似於DB競賽場景中使用的樂觀鎖定示例)。除此之外,補丁指令通常應包含將狀態1轉換爲狀態2所需的步驟。使用JSONPatch f.e.一個請求可能會從收集中刪除一個字段,而另一個請求會嘗試將該項目移動到更遠的位置。由於這兩個請求都依賴於他們當前所知的狀態,所以盲目應用這些值可能是危險的。

HTTP補丁規範,不過,還提供了有關如何處理衝突的情景多個修補程序請求一個提示:

補丁請求可以爲冪等這樣的方式發出, 這也有助於防止相似時間框架內兩個相同資源上的PATCH請求之間的衝突產生不良結果。 來自多個PATCH請求的衝突可能比 PUT衝突更危險,因爲某些修補程序格式需要從已知基點的 操作,否則它們將破壞資源。使用這種補丁應用程序的客戶端 應該使用條件請求 ,以便在客戶端上次訪問資源後,如果資源已更新 ,請求將失敗。例如,客戶端 可以在PATCH 請求的If-Match標頭中使用強大的ETag [RFC2616]。

因此,我建議遵循規範並使用ETag和If-Match HTTP標頭來防止多個修補程序請求發生衝突。

+0

感謝您的信息。我將研究它在Spring數據休息上下文和AngularJS中, –