Validação de dados em Kotlin: bibliotecas Kotlinx.serialization e Valiktor
Validação de dados é uma parte crítica do desenvolvimento em Kotlin, especialmente ao criar REST APIs, trabalhar com formulários ou processar requisições JSON recebidas. Diferente do Python, onde Pydantic ou Marshmallow são populares, no ecossistema Kotlin lideram Kotlinx.serialization (para serialização) e Valiktor (para validação declarativa). Essas bibliotecas permitem verificar a correção dos dados em tempo de compilação e durante a execução, minimizando erros.
Por que a validação é necessária?
Sem validação, a aplicação pode aceitar dados incorretos: strings vazias, valores negativos, email sem "@". Isso leva a bancos de dados com lixo, erros 500 e vulnerabilidades. Em Kotlin, a tipagem ajuda, mas não resolve regras de negócio (por exemplo, "idade de 18 a 120"). As bibliotecas de validação permitem descrever regras de forma declarativa e reutilizá-las.
Como instalar?
Para Kotlinx.serialization, adicione no build.gradle.kts:
plugins { kotlin("plugin.serialization") version "1.9.22"}dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}Para Valiktor (validação pura):
dependencies { implementation("org.valiktor:valiktor-core:0.12.0")}Principais funcionalidades
- Kotlinx.serialization: anotações
@Serializable,@Required,@Rangepara verificação básica de campos durante a desserialização de JSON. - Valiktor: funções
validate,constraint, validadores personalizados, suporte a objetos aninhados e coleções. - Ambas as bibliotecas funcionam com data class do Kotlin e não exigem reflexão.
Exemplo de código em Kotlin
Exemplo simples com Kotlinx.serialization + Valiktor:
import kotlinx.serialization.*import org.valiktor.functions.*import org.valiktor.validate
@Serializabledata class User( @Required val name: String, @Range(from = 18, to = 120) val age: Int, val email: String)
fun main() { val user = User("Alice", 25, "alice@example.com") // Validação via Valiktor validate(user) { validate(User::name).isNotEmpty() validate(User::age).isGreaterThanOrEqualTo(18) validate(User::email).matches(Regex("^[\\\\w.-]+@[\\\\w.-]+\\\\.\\\\w{2,}$")) } println("User $user passou na validação")}Se os dados forem inválidos, o Valiktor lança uma exceção com a descrição do erro.
Quando usar?
- Dados de entrada de API: verificação do corpo da requisição em Ktor ou Spring Boot.
- Formulários: em Android ou aplicações web.
- Configurações: validação de arquivos properties na inicialização da aplicação.
Use Kotlinx.serialization para serialização/desserialização básica, e Valiktor para regras de negócio complexas (por exemplo, verificar se a data de início é menor que a data de término).