Spring 3.2で特別な部分更新機能を実装しようとしています。私たちはバックエンドにSpringを使用しており、単純なJavascriptフロントエンドを持っています。 という私たちの要求に直接的な解決策を見つけることができませんでした。update()関数は値の任意の数を取り、それに応じて永続性モデルを更新する必要があります。Spring Partial Updateオブジェクトのデータバインディング
ユーザーがフィールドを編集して確認すると、IDと変更されたフィールドがjsonとしてコントローラに渡されるように、すべてのフィールドのインライン編集が行われます。コントローラは、クライアントから任意の数のフィールドを取り込み(1〜n)、それらのフィールドのみを更新できる必要があります。
例えば、ID == 1を持つユーザーが自分のdisplayNameを編集するとき、サーバーにポストされたデータは、次のようになります。下記のとおり
{"id":"1", "displayName":"jim"}
現在、我々はUserControllerで中に不完全な解決策を持っている:
を@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public @ResponseBody ResponseEntity<User> update(@RequestBody User updateUser) {
dbUser = userRepository.findOne(updateUser.getId());
customObjectMerger(updateUser, dbUser);
userRepository.saveAndFlush(updateUuser);
...
}
ここでのコードは動作しますが、いくつかの問題があります。@RequestBody
は新しいupdateUser
を作成し、id
とdisplayName
で埋めます。 CustomObjectMerger
は、updateUser
に含まれる唯一のフィールドを更新して、このupdateUser
を対応するdbUser
とマージします。
問題点は、updateUser
のいくつかのフィールドに、デフォルト値とその他の自動生成フィールド値が入力されていることです。このフィールド値は、マージ時にdbUser
にある有効なデータを上書きします。私たちのupdate
がこれらのフィールドも同様に設定できるようにするため、これらのフィールドを無視すべきであることを明示的に宣言するオプションはありません。
私は、Springが自動的にupdate()
関数に明示的に送信された情報のみをdbUser
に(何らかのデフォルト/自動フィールド値をリセットせずに)マージするようにしています。これを行う簡単な方法はありますか?
更新:私はすでにほとんど私が求めているが、それほどではない次のオプションを検討しました。それは@RequestParam
ように更新データを受け取り、(私の知る限り)JSON文字列をしないという問題がある。
//load the existing user into the model for injecting into the update function
@ModelAttribute("user")
public User addUser(@RequestParam(required=false) Long id){
if (id != null) return userRepository.findOne(id);
return null;
}
....
//method declaration for using @MethodAttribute to pre-populate the template object
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public @ResponseBody ResponseEntity<User> update(@ModelAttribute("user") User updateUser){
....
}
私が考えられてきた再書き込み、JSONをより適切に動作するように私のcustomObjectMerger()
をカウントし、それを取るました考慮するフィールドは、HttpServletRequest
から入ってくるフィールドだけです。最初の場所でcustomObjectMerger()
を使用する必要があっても、春がのJSON機能を除いたほぼ正確にを提供しているときにハックを感じます。誰かがこれを行うためにSpringを取得する方法を知っていれば、私は大いに感謝しています!
@SamEsla - 特にネストされたオブジェクトが存在する状況で、より良い解決策を見つけましたか?私は同じ問題を抱えています。この記事を読む前に、あなたと似たようなことをしました..時間があるなら、見てください:http://stackoverflow.com/questions/16473727/spring-3-ajax-post-request-with -requestbody-and-modelattribute-and-sessionatt – arcseldon