Encontrando las validaciones configuradas en un bean

Código Fuente: Ejemplo 3

A continuación vamos a revisar las clases y los métodos que nos permiten obtener información de las distintas validaciones que han sido configuradas en un bean.

Para tener acceso a las clases necesarias necesitamos usar la referencia del objeto Validator. Recordar que una manera simple de obtener esta referencia es hacer lo siguiente:

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
Validator validator = validatorFactory.getValidator();

BeanDescriptor

Esta es la clase principal desde la cual podemos tener acceso a la información referente a las validaciones configuradas de un bean.

Para tener acceso a este objeto necesitamos llamar al método: “getConstraintsForClass” del “validator” enviando como parámetro la clase del bean del que deseamos obtener la información.

BeanDescriptor puertaBeanDescriptor = validator.getConstraintsForClass(Puerta.class);
 
Ya teniendo la referencia al “BeanDescriptor” podemos usar su métodos:

isBeanConstrained()

Este método nos indica si el bean tiene o no configurado alguna validación. Por ejemplo, teniendo en cuenta la definición de la clase Puerta

public class Puerta {
}

el método va a devolver false.

BeanDescriptor puertaBeanDescriptor = validator.getConstraintsForClass(Puerta.class);
System.out.println("Puerta tiene algún constraint:" + puertaBeanDescriptor.isBeanConstrained());

hasConstraints()

Este método nos indica si existen “constraints” a nivel de clase. Por ejemplo asumiendo la siguiente definición de la clase Carro:

public class Carro {
private String codigo;
@NotNull(groups=GrupoBasico.class)
private String numeroPlaca;
@NotNull
private String anio;
@Valid
private Motor motor;

}

el método va a devolver false:

BeanDescriptor carroBeanDescriptor = validator.getConstraintsForClass(Carro.class);
System.out.println("Carro tiene algún constraint de Clase:" + carroBeanDescriptor.hasConstraints());

getConstraintDescriptors()

Este método nos devuelve todos los constraints a nivel de clase que existen, para el caso de la clase Carro nos devolverá un Set de tamaño CERO.

getConstrainedProperties()

Nos devuelve todos los constraints aplicados a los atributos que existen en un bean. Por ejemplo para la clase Carro el tamaño del siguiente Set será 3.

Set<PropertyDescriptor> constraintProperties = carroBeanDescriptor.getConstrainedProperties();
System.out.println("Carro tiene constraints a nivel de Atributos Nro:" + constraintProperties.size());

getConstraintsForProperty(String property)

Nos devuelve un PropertyDescriptor el cual es un objeto que puede tener uno o más ConstraintDescriptors. Por ejemplo para la clase Carro tendríamos lo siguiente:

Para el atributo “codigo”, este método devolverá null, ya que este atributo no tiene ninguna anotación de validación.

PropertyDescriptor codigoPropertyDescriptor = carroBeanDescriptor.getConstraintsForProperty("codigo");
System.out.println("Código property descriptor:" + codigoPropertyDescriptor);

Pero para el atributo "numeroPlaca" si devolverá un objeto con toda la información de validación de ese atributo.

PropertyDescriptor nroPlacaPropertyDescriptor = carroBeanDescriptor.getConstraintsForProperty("numeroPlaca");
System.out.println("Número de Placa property descriptor:" + nroPlacaPropertyDescriptor);

PropertyDescriptor

Contiene toda la información de validación de un atributo de un bean. Comparte varios métodos con el “BeanDescriptor”, ya que ambos implementan la interface:”ElementDescriptor”.

getConstraintDescriptors()

Devuelve todos los ContraintDescriptors asociados a un atributo del bean. Por ejemplo, en el siguiente caso devuelve un Set con un ConstraintDescritpor.

PropertyDescriptor nroPlacaPropertyDescriptor = carroBeanDescriptor.getConstraintsForProperty("numeroPlaca");
System.out.println("Número de Placa property descriptor:" + nroPlacaPropertyDescriptor);
System.out.println("Número de Placa property constraint descriptors:" + nroPlacaPropertyDescriptor.getConstraintDescriptors());

ConstraintDescriptor

Es la clase que tiene toda la información del constraint.

Por ejemplo para el atributo “numeroPlaca” podemos obtener este objeto de la siguiente manera:

PropertyDescriptor nroPlacaPropertyDescriptor = carroBeanDescriptor.getConstraintsForProperty("numeroPlaca");
System.out.println("Número de Placa property descriptor:" + nroPlacaPropertyDescriptor);
ConstraintDescriptor nroPlacaConstraintDescriptor = nroPlacaPropertyDescriptor.getConstraintDescriptors().iterator().next();

Entre sus principales métodos tenemos:

getAnnotation()

Nos devuelve la anotación que usa este constraint.

getAttributes()

Devuelve un Map con todos los atributos seteados en la anotación del constraint.

getGroups()

Devuelve los grupos a los que pertenece el constraint.

getPayload()

Devuelve el payload asociado al constraint.

A tener en Cuenta

Para poder encontrar un constraint teniendo en cuenta algunos filtros podemos usar el método “findConstraints()”, tanto en el “BeanDescriptor” como en el “PropertyDescriptor”

Por ejemplo en el siguiente código estamos buscando todos los constraints que estén configurados en el atributo “numeroPlaca”

Set<ConstraintDescriptor<?>> nroPlacaConstraintDescriptors = 
nroPlacaPropertyDescriptor.findConstraints().
declaredOn(ElementType.FIELD).
getConstraintDescriptors();
System.out.println("Número de Placa Constraint Descriptors:"+nroPlacaConstraintDescriptors);

Tags: , ,

Deja un comentario

Usted debe ser conectado a publicar un comentario.