Validación de datos en Kotlin: revisión de bibliotecas y ejemplos prácticos
La validación de datos es uno de los aspectos clave en el desarrollo de aplicaciones robustas. En el ecosistema de Kotlin existen varias bibliotecas potentes que permiten describir reglas de validación de forma declarativa, evitando estructuras condicionales complejas. En este artículo, analizaremos tres herramientas populares: Konad, Valiktor y Kvalidation. Aprenderá cómo funcionan y verá ejemplos de código para tareas reales.
1. Konad — validación funcional
Konad (Kotlin Validation) utiliza el concepto de mónadas y programación funcional. En lugar de lanzar excepciones, la biblioteca devuelve Validated<E, A>, donde E es el tipo de error y A es el valor exitoso. Esto permite acumular errores y manejarlos sin efectos secundarios.
Instalación
// build.gradle.ktsdependencies { implementation("io.github.mkobit:konad:0.3.0")}Ejemplo de uso
import konad.*
data class User(val name: String, val age: Int)
fun validateUser(user: User): Validated<String, User> { return Validated.valid(user) .validate { it.name.isNotBlank() } { "El nombre no puede estar vacío" } .validate { it.age in 18..99 } { "La edad debe estar entre 18 y 99" }}
fun main() { val user = User("Alice", 25) val result = validateUser(user)
when (result) { is Valid -> println("Usuario válido: ${result.value}") is Invalid -> println("Errores: ${result.errors.joinToString(", ")}") }}Ventajas de Konad:
- Estilo funcional puro sin excepciones
- Acumulación de todos los errores de validación
- Composición de validadores
2. Valiktor — validación declarativa con API fluida
Valiktor ofrece un DSL intuitivo para describir reglas. La biblioteca admite objetos anidados, colecciones y mensajes de error personalizados. Es una de las herramientas más populares para Kotlin.
Instalación
// build.gradle.ktsdependencies { implementation("org.valiktor:valiktor-core:0.12.0")}Ejemplo con objetos anidados
import org.valiktor.*import org.valiktor.functions.*
data class Address(val city: String, val zip: String)data class Person(val name: String, val email: String, val address: Address)
fun validatePerson(person: Person) { validate(person) { validate(Person::name).isNotBlank().hasSize(min = 2, max = 50) validate(Person::email).isEmail() validate(Person::address) { validate(Address::city).isNotBlank() validate(Address::zip).matches("\\\\d{5}".toRegex()) } }}
fun main() { val person = Person("", "correo-invalido", Address("", "123")) try { validatePerson(person) } catch (e: ConstraintViolationException) { e.constraintViolations.forEach { violation -> println("${violation.property}: ${violation.message}") } }}Características de Valiktor:
- Soporte completo para objetos y listas anidadas
- Mensajes de error localizados
- Integración con Spring Boot y Ktor
3. Kvalidation — validación modular basada en anotaciones
Kvalidation (anteriormente Koptional) proporciona tanto un enfoque basado en anotaciones como programático. La biblioteca es especialmente útil para validar datos de entrada en APIs REST.
Instalación
// build.gradle.ktsdependencies { implementation("com.willowtreeapps:kvalidation:1.0.0")}Ejemplo con anotaciones
import com.willowtreeapps.kvalidation.annotations.*import com.willowtreeapps.kvalidation.Validator
data class Product( @field:NotBlank(message = "Pro También en la biblioteca
Trabajo con imágenes en Swift: guía completa para iOS y macOS
Métricas de Prometheus en Node.js: biblioteca prom-client
Trabajo con CSV en C# (.NET): bibliotecas y ejemplos