Melhor Maneira de Fazer Validação

Enquanto desenvolvia, percebi que muitas validadções que tinham de ser feitas eram feitas nas classes ou metodos errados
Agora, resolvi,refatorar, para tentar validar estes em um unico local.
O problema é que queria tambem criar depois um validador especifico para cada objeto, caso seja necessario ou algum desenvolvedor da equipe necessite.

A melhor solução encontrada até agora foi com o uso de enumerações, mas fica amarrado a determinado objeto.

Sugestões sobre a melhor forma de resolver esta situação ??

Agradeço !!

Alguem ? :cry:

vc pode usar Reflections, AOP e Anotação. Qagora precisa ver qual desses vc domina…

Como assim com a AOP ?
Estou usando Reflection e Anotações, mas AOP …
Poderia explicar melhor ?

Então cara…AOP seria a mais bizarra de todas. Então eu sugiro que vc continue nas anotações e no reflection. AOP seria um modo trabalhoso de fazer.

Entendendo-se que AOP trata aspectos de software a necessidade de validações pode ser vista como um aspecto ou não. O que precisa analizar é o quão trabalhoso será desenvolver isso e qual será faclilidade de dar manutenablidade no código pós desenvolvido.

Obrigado, mas …
Bem a duvida é a seguinte, eu irei recuperar um objeto, ai tenho que saber se os valores que foram setados são valores validos.
Teria uma maneira melhor de ser resolvido.
Exemplo:
Tenho um objeto, mas quero saber se todos os valores vindos da interface podem ser valores atribuidos a este objeto, pra não acontecer o seguinte

Pessoa pessoa = new Pessoa();// Objeto criado
pessoa.setIdade("Fulano"); // Valorr recebido e pasado para setar o objeto

Este é oo problema!
Temos que validar os valores antes de atribui-los aos seus respectivos objetos!!!

[quote=71C4700]Enquanto desenvolvia, percebi que muitas validadções que tinham de ser feitas eram feitas nas classes ou metodos errados
Agora, resolvi,refatorar, para tentar validar estes em um unico local.
O problema é que queria tambem criar depois um validador especifico para cada objeto, caso seja necessario ou algum desenvolvedor da equipe necessite.

A melhor solução encontrada até agora foi com o uso de enumerações, mas fica amarrado a determinado objeto.

Sugestões sobre a melhor forma de resolver esta situação ??
[/quote]

Esqueça enumerações.
Vc mesmo valor a solução : criar um objeto validador para cada objeto a ser validado.
Utilize-se do padrão composite para criar uma estrutura de validadores. Ima interface para o validador e um objeto onde colocar
o resultado da validação são boas ideias tb

public interface Validador<T>{

    public ResultadoValidação valida(T obj);
}

[quote=71C4700]Obrigado, mas …
Bem a duvida é a seguinte, eu irei recuperar um objeto, ai tenho que saber se os valores que foram setados são valores validos.
Teria uma maneira melhor de ser resolvido.
Exemplo:
Tenho um objeto, mas quero saber se todos os valores vindos da interface podem ser valores atribuidos a este objeto, pra não acontecer o seguinte

Pessoa pessoa = new Pessoa();// Objeto criado
pessoa.setIdade("Fulano"); // Valorr recebido e pasado para setar o objeto

Este é oo problema!
Temos que validar os valores antes de atribui-los aos seus respectivos objetos!!![/quote]

Não!!
Temos que validar os objetos depois que atribuirmos os valores às suas propriedades.
E
O objeto tem que consistir o seu estado quando uma propriedades é alterada.

Nunca vai ser possivel setar um string num campo int pq o java não deixa.
Se o valor do int é aceitável é uma questão de validação.

Pessoa p = new Pessoa();
p.setNome(request.getParameter("nome");
p.setDataNascimento(parseDate(request.getParameter("nascimento"));

ValidadorPessoa validador = new ValidadorPessoa ();

Resultado res = validador.valida(p);
if (! res.isValido()){
   // não é válido , avisa o usuário.
}

// continua para o processo

Certo.
Mais o grande problema que temos é que.
Não temos a referencia do objeto apenas sua classe.
Ai temos que vallidar
[b]

  1. Tipos
  2. Intevalos de valores
  3. Valores vindos da interface gráfica
    [/b]
    Este é o nosso real problema !!

Alguem ? :cry:

alguma solução sem ser com enumeração ???

então vc esta dizendo q os valores vem aleatoriamente e não se sabe se ele é um Integer, uma String um Doubel ou seja lá o que for…é isso ??? Mais ou menos como se eles viessem de um array de valores e vc quer validar antes de dar os “set” ???

é isso ??

Mais ou menos isso
mas na interface visual os campos do objeto já estam mapeado
???

[quote=71C4700]Mais ou menos isso
mas na interface visual os campos do objeto já estam mapeado
???[/quote]

Na interface visual os campos estão mapeados pra onde ??? Você já diz na view pra onde vai um valor quando der um submit ?

Sugiro vc dar uma olhada no Hibernate Validator, enquanto nao sai a jsr de validacao. Mesmo pq a jsr e o hibernate validator tem como spec leader o mesmo cara.

[quote=Giulliano]
Na interface visual os campos estão mapeados pra onde ??? Você já diz na view pra onde vai um valor quando der um submit ?[/quote]
Os campos estão mapeados para qual atributo do bean esta visão irá realizar o CRUD
É uma aplicação Desktop, onde temos uma disbrituição de camada baseada no MVC,
A responsabilidade da visão se rezumiria apenas a indentificar qual bean ela esta mapeada !!!
A partir da view, iria se contruido o objeto ai sim ele seria validado, ou melhor seria validado primeiro antes da construção!
Este é o problema validar ele sem poder instanciar pois isso será feito por uma Factory.

Sugestões ?

Esqueci no topico anterior…
Muita coisa esta sendo feita por outra classe como a instanciação do objeto que é mapeado na inteface swing.
Agradeço pelas ajudas

Alô pessoal!!

Peço desculpas, sou novo aqui no forum…
Gostaria de saber se alguem pode ajudar-me com isto:

estou a tentar fazer uma validação, isto é, pretendo que só passe os registos que tenham um número valido no campo Nº Cadastro (exemplo: 001). Caso contrario, que surja uma mensagem a dizer que deve ser inserido valores validos no campo.

Aqui vai o trecho do codigo

private class ManipulaBotaoCD implements ActionListener
{
public void actionPerformed(ActionEvent eventoObjecto)
{
String strComandoSQL, strTitulo, strInterpretes, strNumeroDiscos, strDataAquisicao, strObservacoes, strInclusos, strNCadastro;
int intRegistro, aux;

                            aux = Integer.parseInt(fldNCadastro.getText());

			if ((eventoObjecto.getSource() == btnGravar) && (aux != 000) && (fldNCadastro.getText()!= null))
			{
				try
				{
					Conexao = DriverManager.getConnection(RegistrosDB, "root", "junior");

					strTitulo = fldTitulo.getText();
					strInterpretes = fldInterpretes.getText();
                                            strNumeroDiscos = fldNumeroDiscos.getText();
					strDataAquisicao = fldDataAquisicao.getText();
					strObservacoes = fldObservacoes.getText();
					strInclusos = fldInclusos.getText();
                                            strNCadastro = fldNCadastro.getText();
					strComandoSQL = "INSERT INTO dadoscd (Titulo,Interpretes,NumeroDiscos,DataAquisicao,Observacoes,Inclusos, NCadastro) " +
									"VALUES (" +
									"\"" + strTitulo + "\"," +
									"\"" + strInterpretes + "\"," +
                                                                            "\"" + strNumeroDiscos + "\"," +
                                                                            "\"" + strDataAquisicao + "\"," +
									"\"" + strObservacoes + "\"," +
                                                                            "\"" + strInclusos + "\"," +
									"\"" + strNCadastro + "\")";

					Comando = Conexao.createStatement();
					intRegistro = Comando.executeUpdate(strComandoSQL);

					if (intRegistro != 0)
						JOptionPane.showMessageDialog(null, "CD Adicionado !", "Mensagem", JOptionPane.INFORMATION_MESSAGE);

					Comando.close();
					Conexao.close();

					fldTitulo.setText("");
					fldInterpretes.setText("");
                                            fldNumeroDiscos.setText("");
					fldDataAquisicao.setText("");
					fldObservacoes.setText("");
					fldInclusos.setText("");
                                            fldNCadastro.setText("");
					
				}
				catch (Exception Excecao)
				{
					JOptionPane.showMessageDialog(null, "SQLException: " + Excecao.getMessage(), "Erro: Adição de registro", JOptionPane.INFORMATION_MESSAGE);
				}
                                    setVisible(false);
			}
                            else
                            {
                                JOptionPane.showMessageDialog(null, "Nº de Cadastro vazio !", "Mensagem", JOptionPane.INFORMATION_MESSAGE);
                                setVisible(false);
                            }
		}
	}
            
}

Muito Obrigado a todos.
Abraço

procure separar validacao com logica de negocios, se bem que as vezes uma logica necessita ou depende de uma validacao como pre-condicao.

acho interessante que a validacao fique em uma camada intermediaria a logica de negocio, ou seja, a partir da chamada por implementacao de servico, automaticamente teria alguma validacao padrao para questao de consistencia, concorrencia, e suas objecoes especificas.

a partir dai cada entidade de dominio teria sua implementacao generica + objecoes que a funcionalidade a determina possuir, a fim de manter a consistencia de seu estado e situacoes dentro de sua maquina de estados.

O problema é que esta solução deve funcionar pra qualquer objeto!
Pois na interface grafica nao terá acesso propriamente dito ao objeto que ela manipula