Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Validação com camada de serviço

Olá a todos! Atualmente minha arquitetura está assim Controller -> Services -> Repository, para validar as entidades estou utilizando bean validator e para fazer validações de negócio mais complexas estou utilizando a camada service, onde valido por exemplo coisas do tipo: vou vender uma passagem,devo verificar se ainda existem passagens e se uma determinada passagem já foi vendida(apenas exemplo). O problema nessa minha abordagem é que se não tiver mais passagens pra vender lanço uma exception, se a passagem já foi vendida, lanço outra exception, cada condição, exception e trato tudo com try catch no controlador

public class MyController(){
@Post
public void salvar(Coisa coisa){
try{
meuservico.salvar(coisa);
}catch(NegocioException e){
result.redirecTo(MyController.class).formulario();
}
  }
}
public class meuServico(){
public void salvar(Coisa coisa){
if(condicao1){
throw new NegocioException("algo deveria funcionar assim");
}
if(condicao2){
throw new NegocioException("algo deveria funcionar assado");
}
repositorioDeCoisas.salvar(coisa);
}
}

bom, de funcionar funciona, mas acho meio chato ficar lançando esse bando de exception, o contolador fica poluido com um monte de try catch e o usuario não sabe de antemão de todos os erros que está cometendo, eu poderia usar um validator customizado ou talvez um bean validator customizado, mas estou sem tempro pra isso nesse projeto. Uma coisa que me veio na cabeça, mas não sei se é um erro de arquitetura ou design, é eu passar o validator do vraptor para o service

public class MyController(){
@Post
public void salvar(@Valid Coisa coisa){
validator.onErrorForwardTo(this).lista();
meuservico.salvar(coisa,validator);

  }
}
public class meuServico(){
public void salvar(Coisa coisa, Validator validator){
if(condicao1){
validator.add(new SimpleMessage("coisas deveriam ser assim",null));
}
if(condicao2){
validator.add(new SimpleMessage("coisas deveriam ser assado",null));
}
validator.onErrorForwardTo(this).lista();
repositorioDeCoisas.salvar(coisa);
}
}

é valido fazer isso? qual solução vocês adotariam para validar essa camada extra(Service) ?

1 resposta
solução!

Oi Ricardo, passar o validador do Vraptor, pelo menos para mim, gera um acoplamento que parece que você estava tentando fugir. Sua regra de negócio vai ficar acoplada ao framework.. por mais que você não vá trocar de framework de uma hora para outra, é um acoplamento a mais que pode te perturbar em algum ponto do código.

Em relação as exceptions, é o jeito padrão do mercado... Não vejo problemas em vc lançar exceptions e tratar em algum lugar, mesmo que seja no controller...

Uma outra opção, mais abusada :). Da uma olhada no site http://javaslang.io/.. ele tem uma abstração que chama Either, que vem do mundo funcional.. isso vai te permitir ter um retorno no método indicando que pode dar sucesso ou falha e você faria ifs no controller... A vantagem, pelo menos para mim, é em relação a semântica..