Bom, não sei se escolhi o melhor nome para o tópico, mas vou tentar explicar exatamente o que eu quero fazer.
Eu quero usar o getMessage() nas Exceptions pra mostrar o erro pro usuário (eu seto erros bastante descritivos onde as exceptions são lançadas). Na maioria das vezes funciona como eu quero e o resultado é
“Erro no campo X, por favor preenche com um valor válido.”
Porém, quando a exception foi repassada (ou relançada) por uma outra camada, o getMessage() fica assim.
br.com.guj.exception.BusinessException: Erro Interno: Erro no campo X, por favor preenche com um valor válido.
Isso é “resolvido” usando getCause().getCause() infinitamente até achar o getMessage(). Porém isso fica MUITO feio.
Como, meus amigos, vocês sugerem que eu faça pra ter apenas a frase da mensagem, sem o nome da classe aparecendo.
Eu acredito que seria legar você criar um arquivo de properties que contenha a exception e o tipo de mensagem que vc quer que seja apresentada na tela.
BusinessException=Erro no campo X, por favor preenche com um valor válido
É isso?
O problema nisso é que eu uso o mesmo tipo só mudando as mensagens. BusinessException no meu ver (e dentro da função que atribui dentro do meu sistema) simboliza exções lançadas dentro das regras e lógica de negócio. Então eu teria que criar muitos tipos de Exceções…
Eh, vc deveria fazer algo mais internacionalizavel, as mensagens estarem em algum arquivo properties por exemplo, nao que a melhor forma seja mapear: Excecao=mensagem
De qualquer forma, vc provavelmente esta lancando um BusinessException e depois algo esta encapsulando ela dentro de outra excecao (que eh a que vc recebe), essa outra excecao deve estar dessa forma:
public class OutraException extends Exception {
private static final long serialVersionUID = 1L;
public OutraException() {
super();
}
public OutraException(String message, Throwable cause) {
super(message, cause);
}
public OutraException(String message) {
super(message);
}
public OutraException(Throwable cause) {
super(cause);
}
}
Se tiver assim, muda para isso:
public class OutraException extends Exception {
private static final long serialVersionUID = 1L;
public OutraException() {
super();
}
public OutraException(String message, Throwable cause) {
super(message, cause);
}
public OutraException(String message) {
super(message);
}
public OutraException(Throwable cause) {
super(cause.getMessage(), cause);
}
}
Repare que mudou apenas o construtor OutraException(Throwable cause).
Porem, ao inves de lancar tudo BusinessException, eu acharia melhor vc lancar excecoes diversas, algo que a partir da excecao diga para quem esta usando suas classes de modelo o que ocorreu, e entao poder criar uma mensagem especifica, ou no maximo um BusinessException que retorne um codigo de erro, e a partir desse codigo a camada que usa o modelo ter um properties mapeando codigo=mensagem.
Eh como eu geralmente faco…
Implementei a class BusinessException da forma como você falou e ficou como eu queria.
Só pra constar, atualmente já utilizo um propertie pra mensagens do sistema todo, inclusive das Exceptions como você disse usar.