2

私は試しましたが、ここで何が起こっているのか理解できません。

  1. @Controllerを使用して注釈が付けられた単純なコントローラーがあります
  2. @SessionAttributesのアノテーションもあります
  3. GETリクエストを処理し、オブジェクトをモデルに配置します。
  4. フォームからPOSTを取得すると、ユーザーが入力した内容のみが返されます。完全なオブジェクトを取り戻せません。

私はSessionAttributesを初めて使用しますが、これによりオブジェクト全体が保持され、@ ModelAttributeを使用してオブジェクトがメソッドで読み戻されると、オブジェクト(つまり、フォームが変更されたオブジェクト)がマージされると思いました。ただし、この動作は見られません。

どんな助けでも大歓迎です。

コードの関連部分は次のとおりです。

@Controller
@RequestMapping("/user")
@SessionAttributes("user")
public class UserController 
{
      // ... 

@RequestMapping(value = "/{login}", method = RequestMethod.GET)
public String profile(Model model, @PathVariable("login") String login)
      {
           // ...
           model.addAttribute("user", user); 
           // ...
      }

@RequestMapping(value="/{login}", method = RequestMethod.POST)
public String saveProfile(@ModelAttribute("user") @Valid User user, BindingResult result, SessionStatus status)
{
     if (result.hasErrors())
           {
           return "user/index";
     }
           // ... 
           status.setComplete();
     return "redirect:/user/"+user.getLogin(); 
}

私が見逃したかもしれない何かを見ますか?私はこれを理解しようとしてほぼ1日を費やしましたが、理解できません。どんな助けでも大歓迎です。

更新:問題が何であるかを理解しました。回答は以下に掲載されています。

4

3 に答える 3

3

私は多くの労力を費やした後に何が起こっているのかを理解しました。これで他の誰かの時間を節約できることを願っています。

ここでの根本的な問題は2つありました。

  1. セッションで保存されているオブジェクトは、いくつかのアスペクト表記で装飾されていました。このため、オブジェクトの属性値は、適切なgetアクセサーによってのみ返されました。
  2. Hibernate検証を実施しました(POSTを処理するメソッドの@Validアノテーションに注意してください)。バリデーターの注釈は、各フィールドに直接ありました(以下のように):

    @NotNullプライベート文字列名;

これが私がそれを修正した方法です。

  1. テスト目的でのみ、@ Validを削除し、フィールド自体がNULLのように見えても、バックエンドストアに正しいデータを保存していることに気付きました。これが、この問題の根本的な原因に私を導いたものです。
  2. バリデーターのアノテーションが原因であると考えました。メソッドを取得するためにバリデーターのアノテーションを移動しました。そのため、コードは次のように変更されました。

    プライベート文字列名。

    @NotNull public String getName(){...}

  3. @Validアノテーションを元に戻し、検証が失敗しなくなったことを確認しました。

それが誰かを助けて、彼らに仕事の日を救うことを願っています。:)

于 2011-08-23T16:36:01.340 に答える
1

春がプロパティフォームセッションとフォームをマージすることは期待していません。フォームによって送信されたユーザーと、セッションからのユーザーを分離する必要があります。

于 2011-08-23T09:50:42.317 に答える
1

私はAzeemと同じ質問をしましたが、sessionattributeを使用して元のフォームバッキングオブジェクトを送信に投稿された変更と「マージ」できることを明示的に確認しなかったため、はい、フォームからの変更を指摘したいと思います。送信は、元のフォームバッキングオブジェクトにマージされます。

で指摘されているように、このアプローチにはいくつかの問題がある可能性があります

Spring MVC 3.0:永続オブジェクトにバインドするにはどうすればよいですか?

ただし、このアプローチは、複雑なフォームバッキングオブジェクトがあり、ユーザーがフォーム内のオブジェクトグラフメンバーの一部を更新することのみを許可し、フォーム要素内の複雑なオブジェクトの残りを維持するために非表示フィールドを使用しない場合に非常に役立ちます。

クラスで@SessionAttributes( "xxx")アノテーションを使用せずにこのアプローチを使用すると、フォームによって具体的に送信されたメンバーを除いて、返されるフォームバッキングオブジェクトは基本的にnullになります。これにより、新しい更新を元のオブジェクトに自分で組み合わせる必要があるため、更新されたオブジェクトの永続化が非常に困難になる可能性があります。ただし、sessionattributeを使用すると、送信後に提供される完全に更新されたフォームバッキングオブジェクトにより、オブジェクトグラフの永続化がはるかに簡単になります。

于 2013-10-21T07:26:29.607 に答える