は、私は、ユーザーがログインした後にページをレンダリングする簡単な@Controller
クラスを持っている:Spring MVCでModelAttributeへのデータバインディングを禁止する方法は?
@Controller
@SessionAttributes("user")
public class DashBoardController {
@RequestMapping(value="/user/dashBoard", method=RequestMethod.GET)
public String showDashBoardPage(@ModelAttribute("user") User user, Model model) {
//do some work here....
return "dashBoard";
}
}
あなたが見るように、user
属性がすでにセッションで、私はそこだけからそれを引くしたい@ModelAttribute
注釈を使用して存在しています、他には何もない。しかし、あなたがリクエストするパラメータを追加すると、Springはこのパラメータを既存のユーザオブジェクトにバインドしようとします。これは私が望むものではなく、この動作を禁止する方法ですか?
具体的には、ここではUserクラスです:
public class User {
private String name;
private String password;
private Language language;
//public getters and setters here...
}
私は私のdashBoard
ページの言語を変更したい場合は、私は?language=en
パラメータを追加して、このページを要求し、この場合には春が言語を変更しようとしますユーザーモデル属性のフィールド。もちろん、型の不一致例外で失敗します。 もちろん、パラメータ名をUser
のいずれのフィールドとも一致しないものに変更することで回避できますが、それは脆弱な解決策のようです。 このデータバインディング動作を制御する方法はありますか? 私はSpringを使用しています。4.1.3
は使用しないでください '@ ModelAttribute'そのために...それはそれを使用しないでください...あなたがログインしているユーザーがしたい場合はデータバインディングのために使用されていない場合あなたが本当にあなたのカスタムソリューションを使いたいのであれば、 'Principal'を使用して' User'を使って何をすべきかを知っている 'HandlerMethodArgumentResolver'を作成してください。 –
'model'を通して' user'を得ることができるはずです。これは '@ModelAttribute(" user ")User user'の必要性を取り除きます。 – zeroflagL
コメントありがとうございます。私はModelMap#get()を使用してセッションからユーザーを引き出すことにしましたが、後でこの機能を処理するためにSpringセキュリティに移行します。 – troy