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

Validação Regras de Negócio

Olá, Tenho uma aplicação feita em jsf e vou migra lá para Spring MVC.A aplicação é um diário oficial só que além de validações básicas como as apresentadas no curso, que podem ser feitas por bean validation, eu tenho muitas regras de negócio que precisam ser validadas, por exemplo:

-diario incluir novo: não deve existir publicacoes abertas e a adata deve ser maior que a data da ultima publicação, deve possuir uma ou mais matérias confirmadas fechar publicação: diário deve estar aberto e apenas administrador pode fechar a edição publicar: deve estar fechado, não pode já ter sido publicado,apenas administrador pode publicar, só pode publicar um diário por dia,só é permitido publicar ente 00:00h e 10:00h da manhã e a data de circulação deve ser maior que a data de circulação do último diário remover:apenas publicações em abertas podem ser removidas.

A arquitetura que uso é a seguinte: meu managed bean recebe os dados da tela, tenho uma camada de serviço onde faço as validações de negocio acima e o repositório que salva as alterações:



@Named
@ViewScoped
public class GerenciarDiario implements Serializable{

public void fecharDiario(){

@Inject
private DiarioService diarioService;

@Inject
    private FacesMessages messages;
        try {
            this.diario = diarioService.fecharDiario(diario.getDiarioId(),seguranca.getUsuario());

            messages.info("Diário fechado com sucesso");
        } catch (Exception e) {
            messages.error(e.getMessage());
        }
    }

}
@RequestScoped
public class DiarioService {

@Inject
private DiarioRepository diarioRepository;
@Transactional
    public Diario fecharDiario(Integer diarioId,Usuario usuarioFechamento){

        Diario original = diarioRepository.findByPrimaryKey(diarioId);
        Usuario usuario = usuarioRepository.findByPrimaryKey(usuarioFechamento.getUsuarioId());
        boolean canClose = original.permitidoFechar();    
        if(!canClose){
            throw new BusinessException("só é possível fechar diários abertos");
        }else{
            original.fechar(usuario);
        }
        original = diarioRepository.alterarDiario(original);    
        return original;
    }
}

Agora convertendo esse código de JSF + CDI para Spring, eu posso utilizar a mesma arquitetura? controller + service +repository? é correto do ponto de vista arquitetural eu tratar os erros na classe de serviço lançando exceptions? li em algum lugar que isso não seria correto pois exceptions devem representar erros e não validações, é errado fazer assim?

@RequestMapping("/diario")
@Controller
public class DiarioController{


public ModelAndView fechar(@Valid Diario diario,BindingResult result){


try{

this.diario = diarioService.fecharDiario(diario.getDiarioId(),seguranca.getUsuario());
} catch (Exception e) {
            //dar um jeito de adicionar a causa da exception nos erros
}
 if(result.hasErrors()){
        return form();
    }


}


}

Ou eliminar a classe de serviço e fazer todas as validações no controller?

Ou ainda, o Spring permite que eu tenha mais de um validator por Controller, pois o mais bacana seria se eu tivesse um validador para cada operação, é possível isso?:


@RequestMapping("/diario")
@Controller
public class DiarioController{



public ModelAndView fechar(Diario diario,BindingResult result){
//teria seu próprio validator 
}


public ModelAndView publicar(Diario diario,BindingResult result){
//teria seu próprio validator
}


}

Oque vocês me sugerem? qual o melhor local para tratar regras de negócio?

1 resposta
solução!

Minha sugestão é você ter classes do tipo FecharDiarioForm, PublicarDiarioForm etc... elas vão ter as informações dos formulários e podem ter suas validações específicas :). Você vai ter um pouco mais de trabalho, mas vai ganhar em organização. Tenho feito bastante isso e acho que ajuda demais.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software