Доступ к объекту страницы калитки за пределами иерархии компонентов калитки

У меня есть классы pojo, которые обрабатывают мои внутренние соединения. Я хочу инкапсулировать мою (бэкэнд) обработку ошибок в этих классах, перехватывая внутренние исключения.

Есть ли способ получить доступ к текущей странице калитки (или любому компоненту в этом отношении), чтобы я мог оставить отзыв пользователю из-за пределов иерархии компонентов калитки?

class MyService {
...
public void doBackEndThing(){
    try {
        backEndService.doRemoteCall();
    } catch (BackendException e) {
        //we're not inside the component hierarchy! so no getPage() available
        WebPage page = getCurrentPage(); 
        page.error("Backend is currently not available");
    }
}

Я пробовал PageManager, но я понятия не имею, как получить правильную версию, и поэтому я не знаю, будет ли работать вообще:

int version = ?;
WebPage page = (WebPage )Session.get().getPageManager().getPage(version);

person Yashima    schedule 28.03.2014    source источник
comment
Возникают ли эти ошибки в результате действий пользователя?   -  person bert    schedule 28.03.2014
comment
Нет, они возникают из-за сбоев серверной части, таких как недоступность службы. Они могут возникать при любой загрузке страницы или запросе ajax. И я хотел бы уведомить пользователей о том, что в настоящее время приложение может работать некорректно. Конечно, я мог бы просто преобразовать в исключения времени выполнения и вылететь с 500.   -  person Yashima    schedule 28.03.2014
comment
На самом деле загрузка страниц и запросы ajax технически являются взаимодействием с пользователем ... поэтому мой первоначальный ответ должен был быть Да. Теперь, когда я думаю об этом для моего конкретного случая использования, сбой до 500 может быть предпочтительным способом.   -  person Yashima    schedule 28.03.2014


Ответы (2)


Нет хорошего способа, и это не кажется хорошей идеей сделать это. Ваш интерфейс должен вызывать ваш сервер, а не наоборот. Таким образом, самый простой способ сделать это — сохранить ошибки внутри вашего сервиса и получить их на своей странице.

class MyService {

    private String error;

    public void doBackEndThing(){
        try {
            backEndService.doRemoteCall();
        } catch (BackendException e) {
           error ="Backend is currently not available";
        }
    }
}

а также

class MyPage extends WebPage {

    private MySerivce service;

    public void doSomethingFrontendy() {

        error = service.getError();
    }
}

или вы можете вернуть ошибку из своего внутреннего метода или создать исключение и обработать это на своей веб-странице или использовать IRequestCycleListener#onException(), как указал @svenmeier.

person Nicktar    schedule 29.03.2014

Для этого лучше использовать IRequestCycleListener#onException() — вы можете получить доступ к текущей странице через RequestCycle#getActiveRequestHandler().

person svenmeier    schedule 29.03.2014