quote=CodeDeveloper
public class Cadastro extends HttpServlet{
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Livro livro = new Livro(req.getParameter("nome"),req.getParameter("valor"));
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Livro>> violations = validator.validate(livro);
if(violations.size() <= 0){
new LivroDAO.salvar(livro);
}
}
}
Até ai legal… é o padrão de qualquer aplicação.
[/quote]
Sobre como fazer sua propria API de validação. É um pouco mais profundo do que parece.
Porém, tenho a seguinte dúvida:
A validação é feita no servlet, e por este motivo, um outro programador pode realizar o seguinte código:
new UserDAO.save(new Livro("",90));
Supondo que o banco de dados não valide nada (apenas seja responsabilidade da aplicação java), essa abordagem não me garante a integridade da aplicação, no caso o @NotEmpty private String nome.
Existe alguma forma de colocar a validação no processo final de criação do usuario, como no UserDAo.salva, por exemplo???
A validação pode ser colocada onde vc quiser. Aliás, em tese, sempre que vc muda de camada, vc deveria fazer a validação. O que acontece é que existem validações de diferentes tipos.
Na camada de apresentação ( o servlet) vc valida se o input é válido. Ou seja, se o usuário não está tentando driblar alguma regra (por exemplo colocar uma data que não existe), se preencheu tudo o que deveria, etc…
É é a validação básica.
Depois vc valida no serviço. Aqui é uma validação mais de negocio. Se a informação não é repetida, se é permitido, se faz sentido de negocio, etc… estas são validações mais especificas e mais próximas ao negócio.
Depois, se vc quiser vc pode validar na camada de persistência também. É um bocado trivial pq vc só vai validar se não está vazio etc… mas em tese as outras camadas já fizeram isso. É apenas uma segurança a mais.
É bom vc por validação em todas as camadas, exactamente para escapar desse cenário que colocou que “o programador pode fazer asssim e estragar tudo”, mas depende da robustez que o sistema precisa nem sempre é necessário. A regra geral é : quanto mais publico, mais precisa de validação.
Utilizar uma api como a do hibernate validation ajudam vc apenas na camada de persistência. Nas outras as regras são normalmente especificas e dependentes do negocio. É claro que vc pode usar api de validação (Beans Validation, por exemplo), ha muitas por ai, ou vc pode fazer a sua como indiquei - não é difícil. O ponto é que vc use uma api de validação. Compartimentalize e isole bem as regras , use composição de validadores para não reimplementar a mesma regras duas vezes e se possível use annotations. Mas seja consciente que annotations não funciona em todos os casos, então tenha uma forma mais programática sempre à mão.
Validação é muito importante e não é tratada com o devido respeito. Validação é uma parte do domínio e muito importante no modelo de desenvolvimento orientado ao domínio.