Tratamento de exceção em 3 camadas com Spring

4 respostas
V

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:

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);
		}
	}
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

4 Respostas

alexvingg

Cara eu to passando por isso é muito chato e importante o tratamento de exceção eu procuro
sempre seguir um padrão de tratar sempre no ultimo nivel sempre vou jogando pra cima
e no fim eu trato ela também não sei se é a melhor maneira mais ta dando certo ! hehe

WRYEL

Eu estava acompanhando este tópico também, mas sem respostas até agora :frowning:

Acho que você deveria pedir para algum moderador mover ele para a seção de arquitetura.

thiago.correa

alexvingg:
Cara eu to passando por isso é muito chato e importante o tratamento de exceção eu procuro
sempre seguir um padrão de tratar sempre no ultimo nivel sempre vou jogando pra cima
e no fim eu trato ela também não sei se é a melhor maneira mais ta dando certo ! hehe

O certo é ir encapsulando as exceções para exceções da aplicação e sempre deixar a camada que executa a ação poder tratá-la!

alexvingg

Valeu pela dica tiago ! Comecei a fazer isso no projeto q eu to aqui !!

Criado 10 de agosto de 2011
Ultima resposta 12 de ago. de 2011
Respostas 4
Participantes 4