Spring3.2で特別な部分更新機能を実装しようとしています。バックエンドにSpringを使用しており、単純なJavascriptフロントエンドがあります。要件に対する簡単な解決策を見つけることができませんでした。つまり、update()関数は任意の数のfield:valuesを受け取り、それに応じて永続性モデルを更新する必要があります。
すべてのフィールドをインライン編集しているため、ユーザーがフィールドを編集して確認すると、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
dbUser
updateUser
問題は、SpringがいくつかのフィールドにupdateUser
デフォルト値と他の自動生成されたフィールド値を入力することです。これは、マージ時に、にある有効なデータを上書きしますdbUser
。これらのフィールドも設定できるようにしたいので、これらのフィールドを無視する必要があることを明示的に宣言することはオプションではありませんupdate
。
update()
Springが関数に明示的に送信された情報のみをdbUser
(デフォルト/自動フィールド値をリセットせずに)自動的にマージする方法を検討しています。これを行う簡単な方法はありますか?
更新:私はすでに、私が求めていることをほぼ実行する次のオプションを検討しましたが、完全ではありません。問題は、更新データをas@RequestParam
で受け取り、(AFAIK)は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にこれを実行させる方法を誰かが知っているなら、私はそれを大いに感謝します!