web-dev-qa-db-ja.com

SpringMVCのモデル属性に値を保持する

Spring MVCコントローラーを使用していて、値をmodelAttributeに設定してフォームを送信すると、フォームにマップされていないモデルのフィールドの一部が失われます。この例では、年齢と住所をマッピングしなかったため、これらのユーザーのフィールドは失われ、null値があります。ユーザーに年齢と住所を変更させたくないので、これらのフィールドはフォームにありません。

ユーザー編集フォームを投稿するメソッドコントローラー:

@RequestMapping(value = "/edit", method = RequestMethod.POST)
public String editionUser(Model model, @ModelAttribute("accountForm") User user,
  BindingResult bresult,
  RedirectAttributes redirectAttributes) {
  //user.getAge() and user.getAddress are null           

  //Save the information...
}

ユーザーページの編集を取得するメソッドコントローラー:

@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String initEdit(Model model) {
  // the user fields are all filled
  User user = userService.getUserById(...);
  model.addAttribute("accountForm", user);
  return "edition";
}


class User {
  Long id;
  String email;
  String age;
  String address;
  String nickname;

  // ...
}

edition.jsp

<form:form class="form" method="POST" action="edition" modelAttribute="accountForm">
  <form:label path="email">email</form:label>
  <form:input path="email"  name='email'/>
  <form:label path="nickname">nickname</form:label>
  <form:input path="nickname"  name='nickname'/>
  <form:hidden path="id" />
  <input name="submit" type="submit"    value="valid" />  
</form:form>

これらのフィールドの値を失わないための最良の解決策は何ですか? (年齢と住所)

各フィールドにフォームの非表示パスを使用しますか?編集ページにリダイレクトする前にユーザーをセッションに保存し、変更されたフィールドのみを変更するようにpostメソッドコントローラーでユーザーセッションを取得するように設定しますか?一般的な方法はありますか?

16
julus

私は1つの単純な理由でセッションに行きます:
非表示のフォームフィールド 簡単に操作できます フォームを送信する前にクライアント側であるため、要件を満たしていません

以前に入力した値をどこかに保存しないと、クライアント側で改ざんされているかどうかを検出することすらできないため、非表示フィールドは絶対にオプションではないことに注意してください。
セッションを使用します。

7
Michał Rybak

それは古い投稿ですが、おそらく答えは私のような春の初心者を助けるでしょう

残念ながら、@SessionAttributes({"attributeName"})を使用しない限り、オブジェクトの他の属性は失われます。

この投稿はそれを説明しています Spring MVC-1つのページから葯に変数を渡す

4
Shady Hussein

ここで私の答えを参照してください:

JPAでSpring MVCを使用してエンティティの属性のサブセットのみを更新することは可能ですか?

これはあなたのために仕事をするはずです。残念ながら、これ以上エレガントな方法はありません。

ちなみに、Spring WebFlowは、投稿のフィールドのみでモデルを更新しているようです。おそらく、モデルをセッションに格納し、POSTに含まれる値のみを更新します。

2
yglodt