Come creare un validatore personalizzato in Play Framework 2.0?

Play 1.0 viene fornito con una base framework di convalida completa su http://oval.sourceforge.net/ .

Con il rilascio di 2.0, i miei validatori personalizzati non funzionano più.

Come si crea un validatore personalizzato usando Play Framework 2.0?

In Play 2.0, il framework di validazione si estende oltre l’effettiva convalida dei dati quando raggiunge:

  • Annotazioni – per dichiarare facilmente i contraffatti di validazione usando il segno ‘@’
  • Validatori – che in realtà implementano la logica dietro la convalida
  • Messaggi – per visualizzare i messaggi di errore parametrici (conforms a i18)
  • Infine, helper HTML – che incollano tutti i precedenti insieme

Gli helper HTML sono qualcosa di nuovo per Play 2.0. In 1.x, Play era già abbastanza bravo nell’implementare un framework di convalida ben definito. Era potente e facile da usare. Eppure dovevamo ancora colbind il modulo HTML e il framework di validazione insieme. Questo potrebbe essere un po ‘di confusione per il principiante.

Con Play 2.0, questo è ora fatto automaticamente.

Ma concentriamoci sulla risposta e forniamo alcune indicazioni: Creeremo un validatore AllUpperCase , che genera un errore quando:

  • l’input non è una stringa
  • l’input è vuoto
  • uno dei personaggi è in minuscolo.

Il validatore

package myvalidators; import javax.validation.*; public class AllUpperCaseValidator extends play.data.validation.Constraints.Validator implements ConstraintValidator { /* Default error message */ final static public String message = "error.alluppercase"; /** * Validator init * Can be used to initialize the validation based on parameters * passed to the annotation. */ public void initialize(AllUpperCase constraintAnnotation) {} /** * The validation itself */ public boolean isValid(Object object) { if(object == null) return false; if(!(object instanceof String)) return false; String s = object.toString(); for(char c : s.toCharArray()) { if(Character.isLetter(c) && Character.isLowerCase(c)) return false; } return true; } /** * Constructs a validator instance. */ public static play.data.validation.Constraints.Validator alluppercase() { return new AllUpperCaseValidator(); } } 

La prima cosa che potresti notare è l’importazione: Play 2.0 è effettivamente conforms a JSR 303 – Bean Validation Framework. In questo contesto, il validatore deve implementare ConstraintValidator . Che nel nostro caso si traduce AllUpperCase come class AllUpperCase (che introdurremo in un minuto) e T come un Object generico.

Il validatore è diretto:
Abbiamo definito il metodo public boolean isValid (Object object) che restituisce un valore booleano, se true ha superato la convalida. C’è anche un ID messaggio e un metodo che instaza il validatore.

L’annotazione

La class seguente definisce un’annotazione chiamata @AllUpperCase che non accetta parametri ma applica la convalida definita in precedenza. Fornire dettagli relativi al framework di annotazioni non rientra nell’ambito di questo post.

 package myvalidators; import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.*; import javax.validation.*; @Target({FIELD}) @Retention(RUNTIME) @Constraint(validatedBy = AllUpperCaseValidator.class) @play.data.Form.Display(name="constraint.alluppercase") public @interface AllUpperCase { String message() default AllUpperCaseValidator.message; Class[] groups() default {}; Class[] payload() default {}; } 

Nota come l’anotazione si incolla agli altri pezzi del puzzle.

  • @Constraint , un’annotazione JSR 303, collegamenti al validatore
  • @play.data.Form.Display , collega l’annotazione agli helper html di gioco. Si noti che il nome è importante: stiamo definendo un vincolo denominato alluppercase . Play utilizza queste informazioni per chiamare il metodo public static play.data.validation.Constraints.Validatoralluppercase() sul Validator.
  • Infine, si noti che il messaggio predefinito è impostato nell’interfaccia di annotazione.

uso

Ora abbiamo il nostro validatore personalizzato e annotazione

 import myvalidators.*; public static class MyData { @AllUpperCase public String name; } 

Descrivere l’utilizzo non rientra nell’ambito di questo post, per favore trova un esempio funzionante a questo URL