Atualmente o framework seleciona o método para tratamento de exception (anotado com @ExceptionHandler) pelo nome da classe da exception, considerando apenas seu nível na hierarquia.
Por exemplo, se eu tiver o seguinte handler:
@br.gov.frameworkdemoiselle.exception.ExceptionHandler
public void exceptionHandler(Exception e) {
//impl
}
A única exceção tratata será Exception, sem considerar suas subclasses. Se eu quiser tratar uma NullPointerException, por exemplo, teria que escrever outro método específico.
Sugiro que seja alterada a implementação da busca do método para tratamento de exceção, considerando não apenas o método que trata a classe da exception, mas também suas superclasses.
Segue sugestão de implementação, na classe ExceptionHandlerInterceptor, alterando o método getMethod:
private final Method getMethod(final Class<?> type, final Class<?> exceptionClass) {
if (!cache.containsKey(type) || exceptionClass == null) {
return null;
} else if (cache.get(type).containsKey(exceptionClass)) {
return cache.get(type).get(exceptionClass);
} else {
return getMethod(type, exceptionClass.getSuperclass());
}
}
Dessa forma, se não for encontrado um handler específico para a exceção lançada, será utilizado o primeiro handler de sua hierarquia de superclasses, em abordagem bottom-up.
Atualmente o framework seleciona o método para tratamento de exception (anotado com @ExceptionHandler) pelo nome da classe da exception, considerando apenas seu nível na hierarquia. Por exemplo, se eu tiver o seguinte handler:
@br.gov.frameworkdemoiselle.exception.ExceptionHandler public void exceptionHandler(Exception e) { //impl }
A única exceção tratata será Exception, sem considerar suas subclasses. Se eu quiser tratar uma NullPointerException, por exemplo, teria que escrever outro método específico.
Sugiro que seja alterada a implementação da busca do método para tratamento de exceção, considerando não apenas o método que trata a classe da exception, mas também suas superclasses. Segue sugestão de implementação, na classe ExceptionHandlerInterceptor, alterando o método getMethod:
private final Method getMethod(final Class<?> type, final Class<?> exceptionClass) { if (!cache.containsKey(type) || exceptionClass == null) { return null; } else if (cache.get(type).containsKey(exceptionClass)) { return cache.get(type).get(exceptionClass); } else { return getMethod(type, exceptionClass.getSuperclass()); } }
Dessa forma, se não for encontrado um handler específico para a exceção lançada, será utilizado o primeiro handler de sua hierarquia de superclasses, em abordagem bottom-up.