To avoid silent exceptions that are not catched in application implement your ExceptionHandler and do what ever you want with exception.
1. Create your implementation of ExceptionHandler:
public class MyExceptionHandler extends ExceptionHandlerWrapper {
private static Log log = LogFactory.getLog(MyExceptionHandler.class);
private ExceptionHandler wrapped;
public MyExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return wrapped;
}
@Override
public void handle() throws FacesException {
//Iterate over all unhandeled exceptions
Iterator i = getUnhandledExceptionQueuedEvents().iterator();
while (i.hasNext()) {
ExceptionQueuedEvent event = i.next();
ExceptionQueuedEventContext context =
(ExceptionQueuedEventContext)event.getSource();
//obtain throwable object
Throwable t = context.getException();
//here you do what ever you want with exception
try{
//log error
log.error("Serious error happened!", t);
//redirect to error view etc....
}finally{
//after exception is handeled, remove it from queue
i.remove();
}
}
//let the parent handle the rest
getWrapped().handle();
}
}
2. Create your ExceptionHandlerFactory and call your ExceptionHandler:public class MyExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
// this injection handles jsf
public MyExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
//create your own ExceptionHandler
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result =
new MyExceptionHandler(parent.getExceptionHandler());
return result;
}
}
3. Register your exception handler factory in faces-config.xml:<factory>
<exception-handler-factory>
test.MyExceptionHandlerFactory
</exception-handler-factory>
</factory>