リソースの部分的な更新を実行したいと考えています。@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
さらに調査した後、次の解決策を思いつきました。
- 独自のアノテーション @RequestBodyPathVariable を作成しました
- 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