Boa tarde senhores.
Estou desenvolvendo uma aplicação utilizando PrimeFaces, JSF 2 , Spring 3 e Hibernate. Estou com dúvida de como tratar minhas exceções nas camadas e como apresentar uma mensagem amigavel para o usuário em caso de uma exceção.
No meu managedBean manterGrupoUsuario.java tenho o seguinte método que é invocado quando o usuário tentar remover uma entidade.
public String doRemoverAction() {
try {
controleAcessoService.removerGrupoUsuario(grupoUsuarioSelecionado);
adicionarMensagemRemovidoSucessoPadrao();
} catch (ServicoException e) { // Exceção lançada da camada de Serviços
adicionarMensagemGlobalErro(e.getMessage());
} catch (Exception e1) { // Exceção lançada por um motivo desconhecio, é necessário ?
adicionarMensagemExcecaoDesconhecida(e1.getMessage());
}
carregarListatem();
return null;
}
O código acima que pode lançar uma exceção é controleAcessoService.removerGrupoUsuario(grupoUsuarioSelecionado);. A implementação desse método (classe ControleAcessoServiceImpl.java) é o seguinte:
@Transactional(rollbackFor={ServicoException.class})
@Override
public void removerGrupoUsuario(GrupoUsuario grupoUsuario) throws ServicoException {
try {
grupoUsuarioDAO.remover(grupoUsuario);
} catch (PersistenciaException e) {
throw new ServicoException(e);
}
}
Acima está a camada de serviços que simplesmente chama a camada de persistência (GrupoUsuarioDAOWithJPA.java) para remover a entidade. Veja o método da persistência abaixo:
[code] public void remover(GrupoUsuario grupoUsuario) throws PersistenciaException {
try {
grupoUsuario.getListaOperacoesFuncionalidade().clear();
grupoUsuario = entityManager.merge(grupoUsuario);
entityManager.remove(grupoUsuario);
entityManager.flush();
} catch (Exception e) {
throw new PersistenciaException(e);
}
}[/code]
Gostaria de saber se o tratamento das exceções estão correto. Imagine o seguinte cenário. O cara tenta remover a entidade e na camada de persistência é lançada uma exceção dizendo que não é possível remover, pois a entidade é chave em outra tabela. Nesse caso o Exception será encapsulado em PersistenceException e relançada para a camada de serviços, que por sua vez encapsula e relança a exceção para a camada de visão.
Existe uma melhor solução para esse problema?
Obrigado