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