2012-05-10 2 views
1

リソースの部分的更新を実行したい。 @ModelAttribute(既存のリソースを読み込む)と@RequestBodyを組み合わせて、提供されたフィールドに値を設定してから@Validを実行できるという考えがありました。私が理解しているように、@ModelAttributeは何よりも先に呼び出されます。Spring RESTコントローラの部分更新既存リソース

コントローラがModelAttributを呼び出し、ContentPatternエンティティを正しく作成するためにContentPatternConverterを使用しています。それが行われた後、私は@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 } 

私のアプローチを使用してこれを解決する方法や、別の(より良い)解決策がある場合、いくつかのより多くの私は、次の解決策を考え出した研究をした後

UPDATE 1

  1. 私自身の注釈@RequestBodyPathVariable
  2. がHandlerMethodArgumentResolverを実装RequestBodyPathVariableMethodArgumentResolverを書いて作成しました。 1)URIパス変数(例えば、patterns/{id})に基づいて、カスタムコンバーターから既存のリソースを取得します。 2)要求本体からオブジェクトを生成します。 3)既存のリソースと提供されたリソースをマージします。 4)最終オブジェクトを検証します。 https://gist.github.com/2687913

    (より良い/他のマージ方法は、他のケースのために必要になることがあります)

    参考リンク::。 http://blog.42.nl/articles/leveraging-the-spring-mvc-3.1-handlermethodargumentresolver-interface ます。http:5)最終オブジェクト

ソースコードを参照の要旨を返します。 //stackoverflow.com/questions/6591665/merging-two-objects-in-java私は(免責事項が、私はこれを試していない)、このことを考え、そしてここで私は何をするのかであるた

答えて

0

まず、@ModelAttributeは、そのオブジェクトをビューに渡したい場合にのみ表示されます。

@RequestBodyは、Springが入力ボディを解析して(これをJsonとしましょう)、ContentPatternオブジェクトを構築できます。しかし、そのオブジェクトをリポジトリから取得し、関連するフィールドを更新したいとします。

まず、WebArgumentResolverの実装を作成します。 MethodParameterを使用して、ContentPatternクラスからのものであることを確認します。この実装は、ContentPatternオブジェクトの作成に使用するHttpMessageConverterのDependency Injectionとして受け取ります。

次に、あなたは、このように、NativeWebRequestからHttpInputMessageを作成します。

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

次にコンバータを使用して、あなたのContentPatternオブジェクトを作成します。このオブジェクトには、いくつかのフィールド、更新したいフィールド、およびその識別子が入っています。

識別子とリポジトリ、またはEntityManager永続コンテキスト(両方ともSpringによってクラスに注入されている)を使用すると、リポジトリからオブジェクトが取得されます。

これで、リポジトリから取得したものと要求本体から作成したものの2つのContentPatternオブジェクトが作成されました。

オブジェクトのセッターを使用して、オブジェクトをリポジトリーから他のオブジェクトのフィールドで更新し、ValidatorをSpringによってこのクラスに注入して検証します。

すべてが正常であれば、オプションで更新されたオブジェクトを持続性として保存し、それをresolverArgumentメソッドの戻り値として使用します。

これは十分明確です。

+0

ありがとうございます。私は同じコンセプトを使用して終了しましたが、HandlerMethodArgumentResolverを実装しました。 – horte

関連する問題