2012-07-09 14 views
7

Intenté escribir un validador de formulario personalizado para play 2.0.1 utilizando la anotación JSR-303 (nivel de clase) y las implementaciones del validador.Playframework IllegalStateException después de la validación de formulario

Desafortunadamente, cuando presento el formulario y la validación falla obtengo una IllegalStateException que puede ser un error de la obra (pero me gustaría confirmar).

A continuación los extractos de códigos pertinentes y la descripción del problema (sólo partes relevantes para mayor claridad)

parte del código del controlador (que reciben el formulario enviar)

public static Result save() { 
    Form<UserForm> userForm = form(UserForm.class).bindFromRequest(); 
    if (userForm.hasErrors()) { 
     return badRequest(createForm.render(userForm)); 
    } 
    UserForm user = userForm.get(); 

El validador se declara como

public class FieldMatchValidator extends Validator<Object> 
    implements ConstraintValidator<FieldMatch, Object> 

La anotación de validación se declara como

@Target({TYPE, ANNOTATION_TYPE}) 
@Retention(RUNTIME) 
@Constraint(validatedBy = FieldMatchValidator.class) 
@play.data.Form.Display(name="constraint.fieldmatch") 
public @interface FieldMatch { 

    String message() default FieldMatchValidator.message; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 

enviar el formulario consigo el error

Caused by: java.lang.IllegalStateException: No value 
    at play.libs.F$None.get(F.java:217) ~[play_2.9.1.jar:2.0.1] 
    at play.data.Form.get(Form.java:363) ~[play_2.9.1.jar:2.0.1] 
    at controllers.UsersController.save(UsersController.java:40) ~[classes/:2.0.1] 
    at Routes$$anonfun$routes$1$$anonfun$apply$25$$anonfun$apply$26.apply(routes_routing.scala:189) ~[classes/:na] 
    at Routes$$anonfun$routes$1$$anonfun$apply$25$$anonfun$apply$26.apply(routes_routing.scala:189) ~[classes/:na] 
    at play.core.Router$HandlerInvoker$$anon$4$$anon$1.invocation(Router.scala:1086) ~[play_2.9.1.jar:2.0.1] 

La línea de UsersController mencionado es el usuario de la llamada formulario de usuario = userForm.get();

Tratando de entender dónde está el problema, he encontrado que el código ofensivo probablemente esté en el juego Form.java.

El unen Forma (datos de mapas, cuerdas ... allowedFields) contiene:

if(result.hasErrors()) { 

    for(FieldError error: result.getFieldErrors()) { 
    ... 
    } 
return new Form(rootName, backedType, data, errors, None()); 
} 

Y los hasErrors() es

public boolean hasErrors() { 
    return !errors.isEmpty(); 
} 

Lo que pasa es que result.hasErrors() devuelve verdadero (porque el validador definido en el nivel de clase falló), pero la lista de errores incorporados permanece vacía (result.getFieldErrors() devuelve una lista vacía).

Como consecuencia Form.hasErrors() devuelve falso pero Form.get() falla.

¿Me falta algo o es realmente un error?

Gracias y saludos,

Respuesta

4

que golpean el mismo problema, y ​​ya que no era capaz de averiguar es que es un juego! error o un mal uso mío, terminé escribiendo mi propia clase Form extendiendo la clase existente Form.

Puede encontrar mi clase aquí: https://gist.github.com/3074629

sólo hay que poner esta clase en un paquete llamado patch, a continuación, en su controlador, que tendrá que utilizar:

Form<UserForm> userForm = new PatchedForm<UserForm>(UserForm.class).bindFromRequest(); 

y debe hacer ;-) que

Ahora, tengo que llenar un error y una solicitud de extracción al equipo de reproducción ...

+0

Gracias por su comentario. Me "preocupé" por el problema al implementar la función "validar" a nivel de modelo (como se explica en la documentación de juego). Solo una solución, en realidad, no es realmente una solución. –

+0

@JohnSmith Hi John. Creo que puedo tener un problema similar con esto usando el nuevo tipo java.time.LocalDate. ¿Puedes publicar algo que muestre cómo lo hiciste? ¡Cualquier documentación que pueda encontrar con respecto a la implementación de la validación parece solo válida para una versión de juego mucho más antigua! – svaens

8

es un error en el juego. Si su formulario implementa valida, simplemente asegúrese de que el método devuelva nulo cuando no haya errores.Si devuelve un mapa vacío, fallará

Cuestiones relacionadas