Я написал свой собственный обработчик ошибок для пользовательского интерфейса в потоке Vaadin. Но когда я выкидываю исключение, мое представление перестает работать и не показывает читаемое человеком сообщение об ошибке.
Я сделал это в другом приложении, используя Vaadin 8, и работает отлично. Идея в том, чтобы добавить SgiException в мои бэкэнд-сервисы, такие как:
- Товар не найден
- Неверное значение для поля "XXX"
- Нет на складе для товара.
- и т.д.
А потом показать системное уведомление
public static void setDefaultErrorHandler(ErrorEvent errorEvent) {
Throwable t = DefaultErrorHandler.findRelevantThrowable(errorEvent.getThrowable());
String message;
if (t != null) {
message = t.getMessage();
} else {
message = "";
}
log.error(message, t);
SgiException sgiException = getCauseOfType(t, SgiException.class);
if (sgiException != null) {
NotificationBuilder.exception(sgiException.getCode(), sgiException.getMessage());
return;
} else {
NotificationBuilder.exception(UNKNOW_ERROR, (message == null ? "" : message));
return;
}
}
private static <T extends Throwable> T getCauseOfType(Throwable th, Class<T> type) {
while (th != null) {
if (type.isAssignableFrom(th.getClass())) {
return (T) th;
} else {
th = th.getCause();
}
}
return null;
}
И вот как я устанавливаю собственный обработчик ошибок:
@PostConstruct
public void configBaseView() {
VaadinSession.getCurrent().setErrorHandler(Util::setDefaultErrorHandler);
}
В представлении показать это:
Примечание:
Отладка приложения, видение кода, который он выполняет, ищет метод, вызвавший его, по какой-то причине не отображает уведомление.