と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クラスは、要求パラメーター名(クエリ文字列パラメーターやフォームフィールドを含む)を、名前で属性フィールドをモデル化するために照合します。必要に応じて、型変換(文字列からターゲットフィールドタイプへ)が適用された後、一致するフィールドにデータが入力されます。
しかし、このシナリオはかなり一般的だと思いますが、他の人はこれをどのように処理していますか?私の調査結果が正しく、これが予想される動作(またはバグ)である場合、これは非常にエラーが発生しやすいようです。
可能な解決策:
- に変更
@PathVariable("id")
し@PathVariable("somethingElse")
ます。動作しますが、@ RequestParamではそれほど簡単ではありません(たとえば、jqgridのリクエストパラメータIDを別のものに変更する方法がわかりませんが、これは別の問題です)。 @PathVariable("id")
タイプをLongからIntに変更します。これによりUser.id
、id
タイプは異なりますが、Longへのキャストは醜く見えます:)- ここでは使用せず、DBに再度
@ModelAttribute
クエリを実行してください。User
他の方法と一貫性がなく、冗長なDB呼び出しが含まれます。
助言がありますか?