A validação de dados é uma tarefa bastante comum em sistemas onde a entrada de dados é feita principalmente pelo usuário. Em qualquer aplicação, receber dados sempre foi um grande problema, pois não há como prever todas as maneiras que o usuário utilizará para informar seus dados. Por exemplo, caso o campo que receberá uma data não especifique o formato esperado pela aplicação, não há como garantir que o usuário entrará com o dado no formato desejado, o que acaba se tornando um desafio aos programadores.
Diante disso, é necessário realizar o tratamento adequado de todas as informações que são enviadas para evitar que problemas inesperados venham a ocorrer durante o processamento, como exceções que interromperão a execução do sistema, problemas de integridade ou corrupção dos dados e também questões relacionadas à falha de segurança.
Cada informação passada para a aplicação possui um propósito. Assim, é natural que algumas regras sejam introduzidas com o intuito de controlar a interação entre o usuário e o sistema, garantindo deste modo a correta execução das regras de negócio. E com o intuito de garantir o cumprimento dessas regras que o conceito de validação foi implementado. Validar é determinar se os dados capturados pelo sistema seguem as regras lógicas definidas para manter a sua consistência.
Neste contexto, conseguir consolidar e implementar a validação usando uma solução de qualidade como o Hibernate Validator pode melhorar significativamente a confiabilidade do software, especialmente ao longo do tempo, e torná-lo mais amigável ao usuário.
Considerando que as políticas de validação não estruturadas e não controladas vão levar ao aumento dos custos de suporte e manutenção, uma estratégia de validação consolidada pode minimizar significativamente o efeito cascata de mudanças para sua base de código. Além disso, a camada de validação também passa a ser uma ferramenta muito útil durante o processo de depuração, ajudando a localizar defeitos que comprometem o bom funcionamento da aplicação.
Engajado nesta causa, o Hibernate Validator é um projeto open source conduzido pela empresa Red Hat que permite a validação dos dados, presentes nas classes que modelam o domínio da aplicação, em qualquer arquitetura (Web, Desktop, etc.) e em tempo de execução. A motivação para a utilização dessa biblioteca é poder validar os dados diretamente no domínio da aplicação, em vez de realizar esse processo por camadas. Dessa forma, é possível validar campos numéricos, definir se datas informadas serão obrigatoriamente maiores ou menores que a data atual, verificar se o campo pode ser vazio ou não diretamente nas classes de domínio de maneira centralizada e flexível, mantendo o código claro e enxuto.
A partir disso, ao longo desse artigo abordaremos os principais conceitos e características do Hibernate Validator, e veremos como desenvolver um sistema de cadastro de projetos considerando como um dos seus principais requisitos não funcionais a confiabilidade do sistema. Para tanto, serão empregados, além do Validator, a linguagem de programação Java, o ambiente de desenvolvimento Eclipse integrado ao Maven, o sistema de gerenciamento de banco de dados MySQL, o framework JSF e o container web Tomcat. Ademais, o Hibernate será usado como solução integrante da camada de persistência, viabilizando a interface entre a aplicação e o MySQL.
Hibernate Validator
O Hibernate é um framework de mapeamento objeto relacional muito popular entre os desenvolvedores Java. Distribuído sob a licença LGPL, foi criado por Gavin King em 2001, sendo atualmente o framework de persistência de dados mais utilizado. Segundo a documentação oficial: “o Hibernate pretende retirar do desenvolvedor cerca de 95% das tarefas mais comuns de persistência de dados”.
Sua principal característica é a transformação de classes Java em representações de tabelas da base de dados (e dos tipos de dados Java para os da SQL). O Hibernate gera os comandos SQL e libera o desenvolvedor do trabalho manual de transformação, mantendo o programa portável para quaisquer bancos de dados SQL.
O Hibernate Validator, por sua vez, é a implementação de referência da JSR 303 – Bean Validation API. Disponibilizada em dezembro de 2009, a partir da especificação do Java EE 6, na qual foi introduzida a especificação Bean Validation 1.0, o objetivo principal dessa API é permitir a validação dos dados de forma fácil e rápida, através do uso de anotações e, de forma alternativa, utilizando arquivos XML na configuração.
Com o lançamento mais recente da plataforma Java EE, agora na versão 7, a JSR 349 foi divulgada, introduzindo a versão 1.1 da API de validação e trazendo novidades como:
- Uso de injeção de dependências e integração com CDI;
- Validação de parâmetros e retornos de métodos;
- Uso de grupos de conversão;
- Suporte à concatenação de mensagens de violação através deexpression language;
- Integração com outras especificações, como JAX-RS.
Antes do surgimento dessa API, cada framework implementava um mecanismo proprietário para validar as informações, o que criava problemas de incompatibilidade e dificultava a integração com outros frameworks.
Com o surgimento dessa especificação, possibilitou-se uma API padrão para validação que é flexível o suficiente para ser utilizada pelos mais diversos tipos de frameworks. Além disso, a Bean Validation API viabiliza a validação de dados nas classes do domínio da aplicação, processo esse que é mais simples do que quando é feito por camada. Na validação por camada, é necessário verificar o mesmo dado diversas vezes (nas camadas de apresentação, negócio, persistência, etc.), a fim de garantir a consistência da informação, conforme mostra a Figura 1. Ao validar os dados diretamente nas classes de domínio, o processo todo fica centralizado, uma vez que os objetos destas classes normalmente trafegam entre as camadas da aplicação.
O Hibernate Validator, como principal implementação da Bean Validation API, segue a premissa estabelecida pelo DRY
(Don’t Repeat Yourself), que especifica uma forma de adicionar regras e respectivas verificações para
validação automática dos dados, de maneira que estas validações sejam implementadas ...