java - ¿Cómo crear un validador personalizado en Play Framework 2.0?
playframework-2.0 (1)
En Play 2.0, el marco de validación se extiende más allá de la validación real de los datos a medida que alcanza:
- Anotaciones: para declarar fácilmente las restricciones de validación utilizando el signo ''@''
- Validadores - que en realidad implementan la lógica detrás de la validación
- Mensajes: para mostrar mensajes de error parametrizados (compatible con i18)
- Finalmente, ayudantes de HTML - que pegan todos los anteriores juntos.
Los Ayudantes de HTML son algo nuevo para Play 2.0. En 1.x, Play ya era bastante bueno para imponer un marco de validación bien definido. Era potente y fácil de usar. Sin embargo, aún teníamos que conectar el formulario HTML y el marco de validación juntos. Esto podría ser un poco confuso para el principiante.
Con Play 2.0, esto ahora se hace automáticamente.
Pero concentrémonos en la respuesta y brindemos una guía: crearemos un validador AllUpperCase , que genera un error cuando:
- la entrada no es una cadena
- la entrada esta vacia
- uno de los caracteres es minúscula
El validador
package myvalidators;
import javax.validation.*;
public class AllUpperCaseValidator
extends play.data.validation.Constraints.Validator<Object>
implements ConstraintValidator<AllUpperCase, Object> {
/* 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<Object> alluppercase() {
return new AllUpperCaseValidator();
}
}
Lo primero que puede notar es la importación: Play 2.0 cumple con JSR 303 - Bean Validation Framework. En este contexto, el validador necesita implementar ConstraintValidator . Lo que en nuestro caso se traduce en la anotación como clase AllUpperCase
(que introduciremos en un minuto) y T como un Object
genérico.
El validador es sencillo:
Definimos el método public boolean isValid (Objeto de objeto) que devuelve un booleano, si es verdadera la validación aprobada. También hay un ID de mensaje y un método que crea una instancia del validador.
La anotacion
La clase a continuación define una anotación llamada @AllUpperCase
que no toma parámetros pero aplica la validación definida anteriormente. Proporcionar detalles relacionados con el marco de anotación está fuera del alcance de esta publicación.
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<? extends Payload>[] payload() default {};
}
Observe cómo la anotación se pega a las otras piezas del rompecabezas.
-
@Constraint
, una anotación JSR 303, enlaza con el validador -
@play.data.Form.Display
, vincula la anotación a los@play.data.Form.Display
html de reproducción. Tenga en cuenta que el nombre es importante: estamos definiendo una restricción llamada alluppercase . El juego utiliza esta información para llamar al métodopublic static play.data.validation.Constraints.Validator<Object> alluppercase()
en el Validator. - Finalmente, tenga en cuenta que el mensaje predeterminado se establece dentro de la interfaz de anotación.
Uso
Ahora tenemos nuestro validador personalizado y anotación.
import myvalidators.*;
public static class MyData {
@AllUpperCase
public String name;
}
Describir el uso está fuera del alcance de esta publicación, encuentre una muestra de trabajo en esta URL
Play 1.0 viene con un marco de validación con todas las funciones en http://oval.sourceforge.net/ .
Con el lanzamiento de 2.0, mis validadores personalizados ya no funcionan.
¿Cómo se crea un validador personalizado utilizando Play Framework 2.0?