2015-01-02 12 views
7

は、私は、ユーザーがログインした後にページをレンダリングする簡単な@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

+4

は使用しないでください '@ ModelAttribute'そのために...それはそれを使用しないでください...あなたがログインしているユーザーがしたい場合はデータバインディングのために使用されていない場合あなたが本当にあなたのカスタムソリューションを使いたいのであれば、 'Principal'を使用して' User'を使って何をすべきかを知っている 'HandlerMethodArgumentResolver'を作成してください。 –

+1

'model'を通して' user'を得ることができるはずです。これは '@ModelAttribute(" user ")User user'の必要性を取り除きます。 – zeroflagL

+0

コメントありがとうございます。私はModelMap#get()を使用してセッションからユーザーを引き出すことにしましたが、後でこの機能を処理するためにSpringセキュリティに移行します。 – troy

答えて

2

bindingという属性があり、要求パラメータのバインドを無効にする場合はfalseに設定できます。@ModelAttributeという属性があります。使用法:メソッドパラメータの前に@ModelAttribute(binding=false)

参考:click

関連する問題