簡體   English   中英

Spring REST控制器部分更新現有資源

[英]Spring REST controller partial update existing resource

我想對資源執行部分更新。 我有一個想法,我可以結合使用@ModelAttribute(以加載現有資源)和@RequestBody,以使用提供的字段填充它,然后運行@Valid。 據我了解,@ModelAttribute首先被調用。

我的控制器調用ModelAttribut,並使用我的ContentPatternConverter正確創建ContentPattern實體。 盡管這樣做之后,我想用@RequestBody提供的字段填充“模式”,最后檢查它是否有效。 雖然我的ContentPattern通過ModelAttribute創建后沒有填充RequestBody。

@RequestMapping(value = "/patterns/{id}", method = RequestMethod.PUT, produces = "application/json")
@ResponseBody
public ResponseEntity<ContentPattern> updateContentPattern(Principal principal, @ModelAttribute("id") @RequestBody ContentPattern pattern) { //implementation }

有什么想法如何使用我的方法解決這個問題,或者是否有另一個(更好的)解決方案?

更新1

經過更多研究后,我提出了以下解決方案。

  1. 創建了我自己的注釋@RequestBodyPathVariable
  2. 編寫了實現HandlerMethodArgumentResolver的RequestBodyPathVariableMethodArgumentResolver。 它的作用是1)基於URI路徑變量(例如,patterns / {id})從自定義轉換器獲取現有資源。 2)從請求主體創建一個對象。 3)合並現有資源和提供的資源。 4)驗證最終對象。 5)返回最終對象

請參閱要點以獲取源代碼: https : //gist.github.com/2687913

(在其他情況下,可能需要更好/其他合並方法。)

有用的鏈接: http : //blog.42.nl/articles/leveraging-the-spring-mvc-3.1-handlermethodargumentresolver-interface http://stackoverflow.com/questions/6591665/merging-two-objects-in-java

我正在考慮這個,這是我會做的(免責聲明,我沒有嘗試過):

首先,@ ModelAttribute僅在您要將對象傳遞給視圖時才起作用

@RequestBody允許Spring解析您的輸入主體(假設它是Json)並構建一個ContentPattern對象。 但是您想從存儲庫中獲取該對象,然后更新相關字段。

首先,我將創建一個WebArgumentResolver的實現。 使用MethodParameter來檢查它是否來自ContentPattern類。 此實現將以Dependency Injection的形式接收用於創建ContentPattern對象的HttpMessageConverter

然后從NativeWebRequest創建一個HttpInputMessage ,如下所示:

return new ServletServerHttpRequest((HttpServletRequest)nativeWebRequest.getNativeRequest());

然后,使用Converter創建您的ContentPattern對象。 該對象將填充一些字段,您要更新的字段以及其標識符。

使用標識符,存儲庫或EntityManager持久性上下文(均由Spring注入到類中),您可以從存儲庫中獲取對象。

現在,您有兩個ContentPattern對象,一個是從存儲庫獲得的,另一個是從請求正文創建的。

使用對象的設置器,使用另一個對象的字段更新存儲庫中的對象,然后使用同樣由Spring注入到此類的Validator對其進行驗證

如果一切正常,則可以選擇將更新的對象保存為持久性,並將其用作resolverArgument方法的返回值。

我希望這足夠清楚!

暫無
暫無

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

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