Olá a todos. além de verificar se os campos estão preenchidos corretamente, é muito comum também termos validações relacionadas com a regra de negócio, e muitas vezes precisamos inclusive de acesso ao banco de dados. Podemos citar por exemplo a verificação do estoque antes de efetuar uma venda, ou saber se certo item já foi comprado, vendido,reservado, etc...
Onde devemos fazer este tipo de validação? No próprio Controller, em um validador como na aula 06 ou criar uma camada mais específica?
ultimamente tenho optado pela opção 3, por exemplo se na nossa validação fosse exigido que o nome do produto deve ser único:
@Service
public class ProdutoService{
@AutoWired
private ProdutoDao dao;
public void salvar(Produto produto){
Produto other = findProduto(produto.getNome());
if(other != null)
{
throw new NegocioException("produto com esse nome já existe");
}
dao.salvar(produto);
}
}
Aqui no controller é um dos principais pontos da dúvida se escolhi a opção correta, não sei se é muito indicado, mas verifico de houve o erro com try catch, na minha opinião fica um pouco feio
public class ProdutoController{
@RequestMapping(method=RequestMethod.POST)
public ModelAndView gravar(@Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes){
if(result.hasErrors()){
return form();
}
try{
produtoService.gravar(produto);
redirectAttributes.addFlashAttribute("message","Produto cadastrado com sucesso");
return new ModelAndView("redirect:produtos");
}catch(NegocioException e){
redirectAttributes.addFlashAttribute("message",e.getMessage());
return form();
}
}
}
e então, qual caminho seguir?