Após o método de validação ser true, como cancelar o envio dos dados ao banco?

Tenho a aplicação ja feita. A classe Produto, ProdutoDAO e um método validaProdutoPorDescricao()

JButton btnCadastrarProduto = new JButton("Cadastrar");
	btnCadastrarProduto.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			
			Produto prod = new Produto();
			prod.setDescricao(campoDescricao.getText());
			/*if (!prod.validaProdutoPorDescricao(prod))
				JOptionPane.showMessageDialog(null, "Produto com nome inválido");*/

			prod.setSaldoEstoque(Integer.parseInt(campoSaldoEstoque.getText()));
			prod.setPrecoCompra(Float.parseFloat(campoPrecoDeCompra.getText()));
			prod.setPrecoVenda(Float.parseFloat(campoPrecoDeVenda.getText()));
			
			ProdutoDAO prodao = new ProdutoDAO(Database.getConnection());
			prodao.registra(prod);
			
			campoDescricao.setText("");
			campoSaldoEstoque.setText("");
			campoPrecoDeCompra.setText("");
			campoPrecoDeVenda.setText("");
			
			// TODO FAZER AÇÃO DO BOTÃO CADASTRAR
		}
	});
	btnCadastrarProduto.setBounds(231, 200, 135, 25);
	contentPane.add(btnCadastrarProduto);

A parte comentada é onde faço um teste para chamar o método e verificar o argumento passado para ele. O método funciona, porém queria fazer com que, caso o método seja chamado, interromper os dados passados no formulário e cancelar o envio, pois mesmo o método sendo chamado os dados estão indo para o banco.

1 curtida

Vamos primeiro separar as responsabilidades de cada “processo” todo os passos de salvar no banco extrai para um método… e faça o if com a mesma condição… De passar chama o método que vai salvar no banco senão chama o JOptionalPane

Do jeito que tá vc não ta desviando o processo após o if… lembre-se que depois do if ele continua até o fim di método

1 curtida

Quanto a validação, já que seu actionPerformed retorna void, você pode abortar o processo assim…

if (!prod.validaProdutoPorDescricao(prod)) {
    JOptionPane.showMessageDialog(null, "Produto com nome inválido");
    return; //nada depois dessa linha será executado...
}

//todo os restante vem aqui...

Ou usando o tradicional if/else…

if (!prod.validaProdutoPorDescricao(prod)) {
    JOptionPane.showMessageDialog(null, "Produto com nome inválido");
} else {
    //todo o restante vai aqui...
}

Aproveitando… seu método de validação está estranho…

prod.validaProdutoPorDescricao(prod)

Você pede para o próprio objeto se validar passando ele mesmo como parâmetro?

Não seria melhor fazer…

prod.isDescricaoValida()

Afinal, a descrição você já definiu no setDescricao…

3 curtidas

Curti a idéia de renomear o nome do método, obrigado pela ajuda!
E coloquei o resto no else

2 curtidas

Então, esse método eu extraio dentro desse próprio arquivo desse código?

1 curtida

Também!

Mas, eu prefiro uma abordagem melhor a qual seria dar a responsabilidade para uma outro objeto validar seus campos mas, neste caso acredito que você terá que mudar mudar muita coisa no seu código por exemplo aplicar o padrão MVC pois veja que sua view que cria o objeto produto, neste caso a view não deveria fazer isso. Mas, vamos nos concentrar neste caso agora.

Se me permite mudar seu código vamos fazer desta maneira.

Button btnCadastrarProduto = new JButton("Cadastrar");

btnCadastrarProduto.setBounds(231, 200, 135, 25);
contentPane.add(btnCadastrarProduto);

btnCadastrarProduto.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e) {
		
		if (eValido(campoDescricao.getText())) {
			Produto prod = new Produto();
			prod.setDescricao(campoDescricao.getText());

			prod.setSaldoEstoque(Integer.parseInt(campoSaldoEstoque.getText()));
			prod.setPrecoCompra(Float.parseFloat(campoPrecoDeCompra.getText()));
			prod.setPrecoVenda(Float.parseFloat(campoPrecoDeVenda.getText()));
			
			ProdutoDAO prodao = new ProdutoDAO(Database.getConnection());
			prodao.registra(prod);
			
			campoDescricao.setText("");
			campoSaldoEstoque.setText("");
			campoPrecoDeCompra.setText("");
			campoPrecoDeVenda.setText("");
		}
		
		JOptionPane.showMessageDialog(null, "Produto com nome inválido");			
	});

}

public boolean eValido(String campo) {
	
	if (campo == "" || campo == null) {
		return false;
	}
	
	return true;
	
}

Deste jeito você nem cria o objeto produto, pois se o campo não for preenchido já retornar o JOptionalPane evitado passo desnecessário uma vez que, se não foi validado o objeto não precisa ser criado… concordo com o amigo LostSoldier o objeto produto está estranho mesmo como ele valida. Tá certo que você quer dar ao model o comportamento de saber se ele foi criado corretamente, mas, passando ele mesmo por parâmetro? Não acho isso interessante, eu gosto mais de deixar um classe Validadora, por exemplo, responsável por isso é o model a responsabilidade apenas se tudo está nos conformes para ele ser salvo. e deixar o DAO fazer o que tem que fazer e apenas retornar se deu tudo certo salvamento ou não, mas, ai já e com banco…

Porque veja, tem validação para tela, para avaliar se o usuário digitou tudo, tem validação para ver se o usuário digito as coisas certas, tipo o que for data com data, o que for texto com texto… e assim por diante
e tem também a validação para ver se o model foi construido do jeito que deveria.

Procure sobre MVC e validações de frontend e backend.

1 curtida