11

Userのセッションにオブジェクトが保存されています@SessionAttributes@ModelAttributeまた、セッションの値がnullの場合はいつでも初期化するために、で装飾された単純なメソッド。

ユーザークラス:

@Entity
@Table( name="USER")
public class User implements java.io.Serializable {

    private Long id;
    private String username;
    private String password;
    ....

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="ID")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    ...

コントローラ:

@RequestMapping("/item")
@Controller
@SessionAttributes({"user"})
public class MyController {

@ModelAttributeメソッド:

@ModelAttribute("user")
    public User createUser(Principal principal) {
        return userService.findByUsername(principal.getName());
    }

この特定の方法を除いて、すべてが期待どおりに機能しているようです。

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String showItem(@PathVariable("id") Long id, @ModelAttribute("user") User user,
            Model uiModel) {
   ...    
}

問題は、User.idで設定されていること@PathVariable("id")です。私もこれに遭遇したと思い@RequestParamます。どちらも同じ名前とタイプだからだと思います。Springのドキュメント(以下を参照)を読んだ後、これは予想される動作であると想定しています。

次のステップはデータバインディングです。WebDataBinderクラスは、要求パラメーター名(クエリ文字列パラメーターやフォームフィールドを含む)を、名前で属性フィールドをモデル化するために照合します。必要に応じて、型変換(文字列からターゲットフィールドタイプへ)が適用された後、一致するフィールドにデータが入力されます。

しかし、このシナリオはかなり一般的だと思いますが、他の人はこれをどのように処理していますか?私の調査結果が正しく、これが予想される動作(またはバグ)である場合、これは非常にエラーが発生しやすいようです。

可能な解決策:

  1. に変更@PathVariable("id")@PathVariable("somethingElse")ます。動作しますが、@ RequestParamではそれほど簡単ではありません(たとえば、jqgridのリクエストパラメータIDを別のものに変更する方法がわかりませんが、これは別の問題です)。
  2. @PathVariable("id")タイプをLongからIntに変更します。これによりUser.ididタイプは異なりますが、Longへのキャストは醜く見えます:)
  3. ここでは使用せず、DBに再度@ModelAttributeクエリを実行してください。User他の方法と一貫性がなく、冗長なDB呼び出しが含まれます。

助言がありますか?

4

2 に答える 2

5

このアプローチはどうですか-

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String showItem(@PathVariable("id") Long id,
            Model uiModel) {
       User user = (User)uiModel.asMap().get("user");
   ...    
}
于 2012-07-24T00:04:16.957 に答える
0

@SessionAttributeを使用します

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public String showItem(@PathVariable("id") Long id, @SessionAttribute("user") User user,
            Model uiModel) {
   ...    
}
于 2018-01-10T11:49:32.510 に答える