[英]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
經過更多研究后,我提出了以下解決方案。
請參閱要點以獲取源代碼: 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.