2012-04-02 23 views
7

estoy siguiendo el tutorial en http://www.playframework.org/documentation/2.0/JavaFormsFormulario marco juego de validación 2.0

He creado una clase LoginForm.java (En lugar de User.class del ejemplo. No es una clase por persistir, sólo una forma valora titular)

package domain; 

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

public class LoginForm { 

     @Required 
     public String email; 
     public String password; 

} 

Y en mi controlador yo haga (como el ejemplo), pero puedo configurar los valores para vaciar Cuerdas para tratar la anotación @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); 
} 

Pero en:

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

me sale una excepción de ejecución [[IllegalStateException: Sin valor]]

Por lo tanto, nunca se comprueba/viene a

if(loginForm.hasErrors()) 

¿Hay alguien ¿Sabes por qué es esto? Si configuro los valores como el ejemplo:

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

Todo funciona y recupero el objeto LoginForm con los valores correctos. ¿Se supone que debo atrapar la excepción? ¿No debería jugar a cuidar eso y establecer loginForm.hasErrors = true?

¡Gracias por cualquier ayuda!

+0

Parece que la IllegalStateException viene de 'bind'. Tal vez ese método no le permite "enlazar" o "obtener" cuando su mapa no tiene datos. –

+0

Veo, pero lo mismo ocurre con una publicación real cuando uso loginForm.bindFromRequest(). Get(), que vincula los datos de la solicitud. ¿Cómo se podría validar si el usuario no puso ningún dato en los campos del formulario? ¿Sin tener que escribir un método de validación propio? –

+0

Pero dijiste que la publicación real funciona, en la cual no tienes valores vacíos en tu mapa. –

Respuesta

25

Se espera que esto suceda.

Tenga en cuenta que debe usar .get() en el formulario Después de comprobar si hay errores.

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 
Cuestiones relacionadas