Saltar al contenido principal

Jakarta Validation

Abrir en ChatGPT

Java Bean Validation es ampliamente reconocido como el estándar para integrar lógica de validación en aplicaciones Java. Utiliza un enfoque uniforme para la validación al permitir que los desarrolladores anotan las propiedades del modelo de dominio con restricciones de validación declarativas. Estas restricciones se hacen cumplir en tiempo de ejecución, con opciones para reglas tanto incorporadas como definidas por el usuario.

webforJ se integra con Bean Validation a través del adaptador JakartaValidator, proporcionando soporte completo desde el primer momento.

Instalación

Es necesario incluir una implementación compatible, como Hibernate Validator, en tu classpath. Si tu entorno no viene con esta implementación por defecto, puedes agregarla manualmente utilizando las siguientes dependencias de Maven:

<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish.expressly</groupId>
<artifactId>expressly</artifactId>
<version>5.0.0</version>
</dependency>

El JakartaValidator

La clase JakartaValidator actúa como un adaptador, conectando el contexto de enlace de webforJ con Jakarta Validation. Esta integración permite el uso de reglas de validación complejas directamente a través de anotaciones en la clase bean.

Activando JakartaValidator

Para activar el JakartaValidator en todo el contexto, normalmente se utiliza el parámetro useJakartaValidator al construir el BindingContext.

BindingContext<User> context = new BindingContext<>(User.class, true);

Definiendo restricciones para propiedades del bean

Las restricciones basadas en anotaciones se aplican directamente dentro de la clase bean para especificar las condiciones de validación, como se ilustra en el siguiente ejemplo:

public class Hero {
@NotEmpty(message = "El nombre no puede estar vacío")
@Length(min = 3, max = 20)
private String name;

@NotEmpty(message = "Poder no especificado")
@Pattern(regexp = "Fly|Invisible|LaserVision|Speed|Teleportation", message = "Poder no válido")
private String power;

// getters y setters
}

Tales restricciones son tan efectivas como aquellas establecidas programáticamente durante la inicialización del enlace y producen resultados de validación coherentes.

advertencia

Actualmente, el JakartaValidator solo reconoce restricciones que se asignan directamente a propiedades e ignora cualquier validación no asociada directamente con propiedades.

Mensajes de validación sensibles a la configuración regional 25.12

Jakarta Validation admite mensajes de restricción localizados a través de la interpolación estándar de mensajes. Cuando cambias la configuración regional de la aplicación, el JakartaValidator necesita conocer la nueva configuración regional para poder resolver los mensajes en el idioma correcto.

JakartaValidator implementa la interfaz LocaleAware, lo que significa que BindingContext.setLocale() propaga automáticamente la configuración regional a todos los validadores de Jakarta en el contexto. No necesitas actualizar cada validador manualmente.

BindingContext<Hero> context = new BindingContext<>(Hero.class, true);

// Cuando cambia la configuración regional, los validadores de Jakarta automáticamente
// producen mensajes en la nueva configuración regional
context.setLocale(Locale.GERMAN);

En un componente que implementa LocaleObserver, llama a context.setLocale() dentro de onLocaleChange() para mantener los mensajes de validación sincronizados con el idioma de la interfaz de usuario:

@Override
public void onLocaleChange(LocaleEvent event) {
context.setLocale(event.getLocale());
}

Consulta mensajes de validación dinámicos para más información sobre validadores sensibles a la configuración regional.