2012-04-02 2 views
7

は、私は例の代わりにUser.classのクラスLoginForm.javaを(作成しました。ちょうどフォームの値ホルダー永続化のためのクラスではなく、 )フォームバリデーションプレイフレームワーク2.0

package domain; 

import static play.data.validation.Constraints.*; 

public class LoginForm { 

     @Required 
     public String email; 
     public String password; 

} 

そして、私のコントローラでは、私は()の例のようにしてください、しかし、私は@Required注釈をしようとする文字列を空に値を設定します。

Form<LoginForm> loginForm = form(LoginForm.class); 
Map<String,String> anyData = new HashMap(); 
anyData.put("email", ""); 
anyData.put("password", ""); 

//Faking a post 
LoginForm postedLoginForm = loginForm.bind(anyData).get(); 

if(loginForm.hasErrors()) { 
    //Just for this test task, should have another error handling.. 
    return ok("@Required annotation kicked in.."); 
} else { 
    return ok("Got form values, email: " + postedLoginForm.email + " password: " + postedLoginForm.password); 
} 

しかし時:

LoginForm postedLoginForm = loginForm.bind(anyData).get(); 

私は[[IllegalStateExceptionが:いいえ値]]実行例外を取得だから、決してチェックが/

if(loginForm.hasErrors()) 

に来る

は誰もしませんなぜこれが分かっていますか?値を例として設定した場合:

Map<String,String> anyData = new HashMap(); 
anyData.put("email", "[email protected]"); 
anyData.put("password", "secret"); 

すべてが機能し、正しい値でLoginFormオブジェクトを取得します。 私はExceptionをキャッチするはずですか?それを処理してloginForm.hasErrors = trueを設定しないでください。

ありがとうございました!

+0

IllegalStateExceptionが 'bind'から来ているようです。マップがデータを持たないときに、そのメソッドが 'bind'または' get'を許可しないかもしれません。 –

+0

リクエストからデータをバインドするloginForm.bindFromRequest()。get()を使用すると、同じことが実際の投稿に表示されます。ユーザーがフォームフィールドにデータを入力しなかった場合、どのように検証されますか?独自の検証メソッドを記述する必要はありませんか? –

+0

しかし、実際の投稿が機能していて、地図に空の値がないと言っています。 –

答えて

0

これはPlay 2.0フレームワークのバグのようです。私はローカルで同じ問題を再現することができました。

フォローアップしたい場合に備えて、https://play.lighthouseapp.com/projects/82401-play-20/tickets/313チケットをオープンしました。

+0

ご協力いただきありがとうございます! –

+1

問題が無効として閉じられました - これは予想される動作です –

25

これは予想される動作です。

フォームで.get()を使用する必要があることに注意してください。エラーを確認してください。

LoginForm preLoginForm = loginForm.bind(anyData); 

if(loginForm.hasErrors()) { 
    //Just for this test task, should have another error handling.. 
    return ok("@Required annotation kicked in.."); 
} 
LoginForm postedLoginForm = preLoginForm.get(); 
// ... Now use postedLoginForm