Ho provato a scrivere un validatore di modulo personalizzato per la riproduzione 2.0.1 utilizzando l'annotazione JSR-303 (livello di classe) e le implementazioni del validatore.Playframework IllegalStateException dopo la convalida del modulo
Purtroppo, quando invio il modulo e la convalida fallisce, ottengo un IllegalStateException che potrebbe essere un bug di un gioco (ma vorrei confermare).
riporta qui di seguito gli estratti di codice rilevanti e la descrizione del problema (solo le parti rilevanti per amor di chiarezza)
Parte del codice di controllo (che ricevono la forma presentare)
public static Result save() {
Form<UserForm> userForm = form(UserForm.class).bindFromRequest();
if (userForm.hasErrors()) {
return badRequest(createForm.render(userForm));
}
UserForm user = userForm.get();
Il validatore viene dichiarato come
public class FieldMatchValidator extends Validator<Object>
implements ConstraintValidator<FieldMatch, Object>
L'annotazione di convalida è dichiarato come
@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 {};
Invio forma ottengo l'errore
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 linea del UsersController menzionato è l'utente chiamata Form utente = userForm.get();
Cercando di capire dove si trova il problema, ho trovato che il codice incriminato è probabilmente in Form.java.
Il bind Form (dati cartografici, String ... allowedFields) contiene:
if(result.hasErrors()) {
for(FieldError error: result.getFieldErrors()) {
...
}
return new Form(rootName, backedType, data, errors, None());
}
E i hasErrors() è
public boolean hasErrors() {
return !errors.isEmpty();
}
Quello che succede è che result.hasErrors() restituisce true (perché il validatore definito a livello di classe non è riuscito), ma l'elenco degli errori creati rimane vuoto (result.getFieldErrors() restituisce una lista vuota).
Di conseguenza, Form.hasErrors() restituisce false ma Form.get() ha esito negativo.
Mi manca qualcosa o è in realtà un bug?
Grazie e saluti,
Grazie per il tuo commento. Ho "aggirato" il problema implementando la funzione "convalida" a livello di modello (come spiegato nella documentazione di gioco). Solo una soluzione, in realtà, non è davvero una soluzione. –
@JohnSmith Ciao John. Penso che potrei avere un problema simile con questo usando il più nuovo tipo java.time.LocalDate. Puoi pubblicare qualcosa che mostra come hai fatto questo? Qualsiasi documentazione che riesca a trovare sull'implementazione della validazione sembra valida solo per una versione di gioco molto più vecchia! – svaens