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,
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. –
@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