Datenvalidierung in Kotlin: Überblick über Bibliotheken und praktische Beispiele
Datenvalidierung ist einer der Schlüsselaspekte bei der Entwicklung zuverlässiger Anwendungen. Im Kotlin-Ökosystem gibt es mehrere leistungsstarke Bibliotheken, die es ermöglichen, Prüfregeln deklarativ zu beschreiben und umfangreiche bedingte Konstrukte zu vermeiden. In diesem Artikel betrachten wir drei beliebte Werkzeuge: Konad, Valiktor und Kvalidation. Sie erfahren, wie sie funktionieren, und sehen Codebeispiele für reale Aufgaben.
1. Konad — Funktionale Validierung
Konad (Kotlin Validation) verwendet das Konzept von Monaden und funktionaler Programmierung. Anstatt Ausnahmen auszulösen, gibt die Bibliothek Validated<E, A> zurück, wobei E der Fehlertyp und A der erfolgreiche Wert ist. Dies ermöglicht das Sammeln von Fehlern und deren Verarbeitung ohne Seiteneffekte.
Installation
// build.gradle.ktsdependencies { implementation("io.github.mkobit:konad:0.3.0")}Anwendungsbeispiel
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() } { "Name darf nicht leer sein" } .validate { it.age in 18..99 } { "Alter muss zwischen 18 und 99 liegen" }}
fun main() { val user = User("Alice", 25) val result = validateUser(user)
when (result) { is Valid -> println("Gültiger Benutzer: ${result.value}") is Invalid -> println("Fehler: ${result.errors.joinToString(", ")}") }}Vorteile von Konad:
- Reiner funktionaler Stil ohne Ausnahmen
- Sammeln aller Validierungsfehler
- Komposition von Validatoren
2. Valiktor — Deklarative Validierung mit fluent API
Valiktor bietet eine intuitive DSL zur Beschreibung von Regeln. Die Bibliothek unterstützt verschachtelte Objekte, Sammlungen und benutzerdefinierte Fehlermeldungen. Es ist eines der beliebtesten Werkzeuge für Kotlin.
Installation
// build.gradle.ktsdependencies { implementation("org.valiktor:valiktor-core:0.12.0")}Beispiel mit verschachtelten Objekten
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("", "ungültige-email", Address("", "123")) try { validatePerson(person) } catch (e: ConstraintViolationException) { e.constraintViolations.forEach { violation -> println("${violation.property}: ${violation.message}") } }}Besonderheiten von Valiktor:
- Vollständige Unterstützung für verschachtelte Objekte und Listen
- Lokalisierte Fehlermeldungen
- Integration mit Spring Boot und Ktor
3. Kvalidation — Modulare Validierung basierend auf Annotationen
Kvalidation (früher Koptional) bietet sowohl einen annotierungsbasierten als auch einen programmatischen Ansatz. Die Bibliothek eignet sich besonders zur Überprüfung von Eingabedaten in REST-APIs.
Installation
// build.gradle.ktsdependencies { implementation("com.willowtreeapps:kvalidation:1.0.0")}Beispiel mit Annotationen
import com.willowtreeapps.kvalidation.annotations.*import com.willowtreeapps.kvalidation.Validator
data class Product( @field:NotBlank(message = "Pro Auch in der Bibliothek
Arbeit mit Kafka in Go (Golang): Bibliothek segmentio/kafka-go
Aufgabenplaner in Rust: Erstellung eines zuverlässigen Job Schedulers
Java-Aufgabenplaner: Quartz Scheduler – Vollständiger Leitfaden
Bull (Aufgabenwarteschlange für Node.js)