1

リソースの部分的な更新を実行したいと考えています。@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

4

1 に答える 1

0

私はこれについて考えていました、そしてこれが私がすることです(免責事項、私はこれを試していません):

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

@RequestBodyを使用すると、Springは入力本文(たとえばJson)を解析し、ContentPatternオブジェクトを構築できます。ただし、リポジトリからそのオブジェクトを取得してから、関連するフィールドを更新する必要があります。

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

次に、次のように、NativeWebRequestからHttpInputMessageを作成します。

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

次に、Converterを使用して、ContentPatternオブジェクトを作成します。このオブジェクトには、いくつかのフィールド、更新するフィールド、およびその識別子が入力されます。

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

これで、2つのContentPatternオブジェクトができました。1つはリポジトリから取得され、もう1つはリクエスト本文から作成されました。

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

すべて問題がない場合は、オプションで更新されたオブジェクトを永続性に保存し、それをresolverArgumentメソッドの戻り値として使用します。

これが十分に明確であることを願っています!

于 2012-05-10T18:00:40.070 に答える