2012-04-02 18 views
7

ich nach dem Tutorial http://www.playframework.org/documentation/2.0/JavaFormsFormularvalidierung Spiel framework 2.0

ich eine Klasse LoginForm.java erstellt haben (statt User.class aus dem Beispiel. Nicht eine Klasse für persistierende, nur eine Form Werte Halter

)
package domain; 

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

public class LoginForm { 

     @Required 
     public String email; 
     public String password; 

} 

Und in meinem Controller ich tue (als Beispiel), aber ich die Werte Strings leeren die @Required Anmerkung zu versuchen.

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

Aber:

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

ich eine Execution Ausnahme erhalten [[Illegal: Kein Wert]]

es also nie überprüft/kommt zu

if(loginForm.hasErrors()) 

Hat jemand weiß warum das so ist? Wenn ich die Werte wie das Beispiel gesetzt:

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

Alles funktioniert und ich rufe Sie das Loginform-Objekt mit den richtigen Werten. Soll ich die Ausnahme fangen? Sollte nicht spielen, pass auf und setze loginForm.hasErrors = true?

Danke für jede Hilfe!

+0

Es scheint, als würde die IllegalStateException von 'bind' kommen. Vielleicht erlaubt es diese Methode nicht, zu "binden" oder "zu bekommen", wenn Ihre Karte keine Daten enthält. –

+0

Ich sehe aber das gleiche gilt für einen echten Beitrag, wenn ich loginForm.bindFromRequest(). Get(), die Daten aus der Anfrage bindet. Wie würde man validieren, wenn der Benutzer keine Daten in die Formularfelder eingegeben hat? Ohne eine eigene Validierungsmethode schreiben zu müssen? –

+0

Aber Sie sagten, dass der echte Post funktioniert, in dem Sie keine leeren Werte in Ihrer Karte haben. –

Antwort

25

Dies ist das erwartete Verhalten.

Beachten Sie, dass Sie .get() im Formular Nach der Prüfung auf Fehler verwenden müssen.

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