GWT-платформа: метод onReveal() не вызывается при обновлении браузера, когда приложение развернуто на tomcat/jboss

В одном из моих приложений GWT-Platform я сталкиваюсь со странной проблемой, когда я запускаю приложение в причале, настроенном в плагине eclipse GWT, и обновляю браузер, текущая страница загружается успешно (placeManager.getCurrentPlaceRequest()), но когда война приложений развертывается в Выполнение tomcat/jboss останавливается после метода onBind() ведущего запроса текущего места и не показывает страницу.

В процессе обработки обновления первый раз метод canReveal() GateKeeper для этого презентатора возвращает false, и после вызова сервера я снова показываю текущее место, что приводит к тому, что метод canReveal() возвращает true, но презентер по-прежнему не раскрывается. Так вот, я подозреваю что-то хитрое!!

Есть намек на такое поведение?

Ниже приведен фрагмент кода для реализованного LoggedInGatekeeper, играющего ключевую роль:

public class LoggedInGatekeeper implements Gatekeeper {

private final EventBus eventBus;

private final DispatchAsync dispatcher;

private final PlaceManager placeManager;

private CurrentUser currentUser;

private boolean isUserLoggedOut;

private String lastPageAccessed;

@Inject
public LoggedInGatekeeper(final EventBus eventBus, final DispatchAsync dispatcher, final PlaceManager placeManager)
{
    this.eventBus = eventBus;

    this.dispatcher = dispatcher;

    this.placeManager = placeManager;

    this.eventBus.addHandler(LoginAuthenticatedEvent.getType(), new LoginAuthenticatedEventHandler()
    {
        @Override
        public void onLogin(LoginAuthenticatedEvent event)
        {
            currentUser = event.getCurrentUser();
            isUserLoggedOut = false;
        }
    });

    this.eventBus.addHandler(LogoutUserEvent.getType(), new LogoutUserEventHandler()
    {
        @Override
        public void onLogoutUser(LogoutUserEvent event)
        {
            SessionFactory.removeCookie(Constants.LAST_PAGE_ACCESSED);
            currentUser = null;
            isUserLoggedOut = true;
        }
    });
}

@Override
public boolean canReveal()
{
    Log.info("Browser fetched session cookie : " + Cookies.getCookie(Constants.JSESSION_COOKIE_KEY));

    if (Cookies.getCookie(Constants.JSESSION_COOKIE_KEY) == null)
    {
        SC.say("Your session is expired. Please login again");
        NavigateToLoginEvent.fire(eventBus);
        return false;
    }

    if (currentUser != null && !isUserLoggedOut)
    {

        lastPageAccessed = placeManager.getCurrentPlaceRequest().getNameToken();
        Log.info("canReveal() 1 : " + lastPageAccessed);
        SessionFactory.addCookie(Constants.LAST_PAGE_ACCESSED, lastPageAccessed);
        return currentUser.isLoggedIn();
    }
    else if (isUserLoggedOut)
    {
        Log.info("canReveal() 2 : User is logged out");
        NavigateToLoginEvent.fire(eventBus);
        return false;
    }
    else
    {
        Log.info("canReveal() 3 : Check on server for logged in user");
        dispatcher.execute(new FetchLoggedInUserAction(), new FetchLoggedInUserAsyncCallback());
        return true;
    }
}

class FetchLoggedInUserAsyncCallback extends MessageAsyncCallback<FetchLoggedInUserResult>
{
    /**
     * 
     */
    public FetchLoggedInUserAsyncCallback()
    {
        super("Loading...");
    }

    @Override
    public void doOnFailure(Throwable caught)
    {
        NavigateToLoginEvent.fire(eventBus);
    }

    @SuppressWarnings("unchecked")
    @Override
    public void doOnSuccess(FetchLoggedInUserResult result)
    {
        if (result == null)
        {
            Log.info("doOnSuccess() 1 : LoggedInUser not found on server");
            NavigateToLoginEvent.fire(eventBus);
        }
        else
        {
            Log.info("doOnSuccess() 2 : LoggedInUser found on server");
            if (result.getLoggedInUser() != null)
            {

                currentUser = new CurrentUser();
                currentUser.setMerchantConsoleUser(result.getLoggedInUser());

                SessionFactory.getClientSessionInstance().put(SessionKeys.LOGGED_IN_USER, result.getLoggedInUser());

                PlaceRequest currentPlaceRequest = placeManager.getCurrentPlaceRequest();

                Log.info("doOnSuccess() 3 : " + currentPlaceRequest.getNameToken());

                if (currentPlaceRequest != null)
                {   
                    placeManager.revealPlace(currentPlaceRequest);
                }
            }
            else
            {
                NavigateToLoginEvent.fire(eventBus);
            }
        }
    }
}

}

Заранее спасибо.


person Bhavesh    schedule 19.09.2012    source источник
comment
Можно ли опубликовать фрагмент вашего кода? например, метод onReveal.   -  person David    schedule 20.09.2012
comment
DVD, Добавлен код по запросу. Вы заметите, что все дело здесь в авторизованном доступе к страницам. Я получаю осложнения для сценария обновления. Я не переопределял какой-либо метод презентатора onReveal(), если это не требуется, поэтому там не будет ничего существенного.   -  person Bhavesh    schedule 21.09.2012
comment
Есть ли у вашего привратника аннотация @singleton?   -  person David    schedule 21.09.2012
comment
Нет. Я попробую, применив @Singleton. Интересно, имеет ли это какое-то значение в другой среде (причал+затмение против Tomcat/Jboss).   -  person Bhavesh    schedule 21.09.2012
comment
Пока не повезло. Это не работает.   -  person Bhavesh    schedule 21.09.2012


Ответы (1)


Тайна раскрыта, добавлен следующий код в метод onBind(), и обновление браузера начало работать во всех средах, как и предполагалось. Это похоже на нечеткое поведение фреймворка, когда GateKeeper пытается получить данные с сервера в то время, когда видимость презентатора каким-то образом установлена ​​на false, и эта же мысль заставила меня написать следующий код, и это сработало. Надеюсь, кто-то из GWT-P может посмотреть в этом посте, чтобы подумать о правильном способе обработки такого сценария:

/**
     * This piece of code takes care of revealing page on browser refresh event.
     * On browser refresh somehow visibility of page is set to false, so, we need to manually fire the reveal content event.
     */
    if(this.getProxy().canReveal() == true && !this.isVisible()){
                revealInParent();
    }
person Bhavesh    schedule 25.09.2012