1. Introdução
Todos somos sabedores de que a consistência das informações em uma aplicação, seja ela web ou não, é coisa séria e que devemos estar sempre atentos para não passarmos batidos e incluirmos dados inconsistentes em nosso sistema gestor de base de dados. Como estamos falando especificamente de aplicações web feitas em Grails, quero compartilhar com vocês a forma com que esse framework valida suas informações, além de ensinar como customizar esse tipo de recurso, que é chamado de validator.
2. Validação no Grails
As validações de dados feito a nível de modelo no Grails são realizadas utilizando a API Spring Validator. Essa API, apesar de ser um pouco complexa de se utilizar, o Grails, através dos recursos dinâmicos da linguagem Groovy, simplifica essa tarefa disponibilizando para o desenvolvedor um mecanismo chamado de constraints que são declarações de regras de validações aplicadas a cada atributos do modelo que necessitem ser validados antes de serem persistidos.
Para entendermos melhor como tudo isso funciona, vamos analisar o seguinte código:
Listagem 1: Código inicial
class Contato {
String nome
String email
static constraints = {
nome(blank:false)
email(blank:false,email:true)
}
}
No exemplo anterior, a classe Contato possui dois atributos: nome e email. Ambos não podem ser vazios e o atributo email só pode aceitar valor no padrão válido para email.
O Grails possui vários validators disponíveis para o desenvolvedor utilizar, como o próprio blank e email, além de size, inList, max, maxSize, min, minSize, notEqual, nullable, unique, url, etc. Porém existe um tipo especial que é utilizado para customizar sua própria validação, que se chama validator.
Para usar o validator customizado basta incluir um closure com a expressão de validação. Esse closure envia 2 parâmetros que são: o valor e a instância do modelo.
A expressão do closure deve retornar um dos seguintes valores:
- Null ou true: Indica que o valor e válido.
- Null: Indica que o valor é inválido e usa a mensagem de erro padrão.
- String: Código da mensagem de erro presente no arquivo de mensagens.
- Lista: Código da mensagem de erro presente no arquivo de mensagens com seus argumentos.
Para o leitor entender melhor como tudo isso funciona, veja a seguir, um exemplo de customização de validator.
Listagem 2: Customização de Validator
class Teste {
Integer diaSemana
String finalSemana
String sexo
static constraints = {
diaSemana (validator:{ value, object ->
return value > 0 && value < 8
})
finalSemana (validator:{ value, object ->
if (![‘sábado‘,’domingo’].contains(value)) {
return ‘custom.erro.finalSemana’
}
})
sexo (validator:{ value, object ->
if (![‘M‘,’F’].contains(value)) {
return [‘custom.erro.sexo’, value]
}
})
}
}
Para concluir nosso exemplo, veja como fica o arquivo de mensagens presente no diretório i18n.
Listagem 3: Concluindo o exemplo
custom.erro.finalSemana=Valor não permitido, use sábado ou domingo.
custom.erro.sexo=Valor {0} inválido para sexo, use M ou F.
3. Conclusão
Como podemos perceber, validação de dados em Grails é muito simples de implementar. Além do framework disponibilizar vários validators, ainda podemos customizar esse recurso da maneira que acharmos necessário para manter a integridade das informações em nossos projetos. Também vimos que podemos mapear as mensagens de erro geradas pelos validators de maneira simples e direta, integrando esse recurso a um outro, também muito importante em uma aplicação web, que se chama internacionalização.
4. Referências
Grails - Validators. Disponível em: http://grails.org/doc/latest/ref/Constraints/validator.html. Acessado em: 07/04/2012
Grails - Validations. Disponível em: http://grails.org/doc/latest/guide/validation.html. Acessado em: 07/04/2012