2012-04-02 10 views
7

Obserwuję samouczka na http://www.playframework.org/documentation/2.0/JavaFormsKształt ramy zabaw walidacja 2,0

Utworzyłem LoginForm.java klasy (zamiast User.class od przykładu. Nie jest to klasa dla utrzymujących się tylko formą wartości uchwyt)

package domain; 

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

public class LoginForm { 

     @Required 
     public String email; 
     public String password; 

} 

a w moim kontroler mam zrobić (jako przykład), ale ja ustawić wartości opróżnić Strings spróbować @Required adnotacji.

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); 
} 

Ale w:

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

uzyskać wyjątek wykonania [[IllegalStateException: Brak wartości]]

więc nigdy nie sprawdza/przychodzi do

if(loginForm.hasErrors()) 

Czy ktoś wiesz, dlaczego tak jest? Jeśli ustawię wartości jako przykład:

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

Wszystko działa i pobieram obiekt LoginForm z poprawnymi wartościami. Czy mam złapać wyjątek? Nie powinno się tego przejmować i ustawić loginForm.hasErrors = true?

Dzięki za pomoc!

+0

Wygląda na to, że wyjątek IllegalStateException pochodzi z 'bind'. Być może ta metoda nie pozwala ci na "bind" lub "get", gdy twoja mapa nie ma danych. –

+0

Widzę, ale to samo dotyczy prawdziwego postu, gdy używam loginForm.bindFromRequest(). Get(), który wiąże dane z żądania. Jak można sprawdzić, czy użytkownik nie wstawił żadnych danych w polach formularza? Bez konieczności pisania własnej metody sprawdzania poprawności? –

+0

Ale powiedziałeś, że prawdziwe prace pocztowe, w których nie masz pustych wartości na mapie. –

Odpowiedz

25

To oczekiwane zachowanie.

Pamiętaj, że musisz użyć .get() w formularzu Po sprawdzeniu, czy nie ma błędów.

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