为什么在调用EventHandler(GWT)之前调用了GateKeeper的canReveal()?

为什么在调用EventHandler(GWT)之前调用了GateKeeper的canReveal()?,gwt,gwtp,Gwt,Gwtp,我得到了一个标题presenter,它是嵌套的presenter。Customer presenter是Header presenter的子级(即Customer presenter被放入Header presenter的插槽中) 所以我想使用MyGateKeeper来管理登录页面。将触发PassUserInfoEvent的HeaderPresenter public class MyGateKeeper implements Gatekeeper{ private String logined

我得到了一个标题presenter,它是嵌套的presenter。Customer presenter是Header presenter的子级(即Customer presenter被放入Header presenter的插槽中)

所以我想使用MyGateKeeper来管理登录页面。将触发PassUserInfoEvent的HeaderPresenter

public class MyGateKeeper implements Gatekeeper{
private String loginedUserID="";

private final EventBus eventBus;

@Inject
public MyGateKeeper (final EventBus eventBus){

    this.eventBus = eventBus;


    this.eventBus.addHandler(PassUserInfoEvent.getType(), new PassUserInfoHandler(){

        @Override
        public void onPassUserInfo(PassUserInfoEvent event) {
            // TODO Auto-generated method stub
            String userID=event.getUserID();
            loginedUserID=userID;   
        }

    });
}

@Override
public boolean canReveal(){
    System.out.println(loginedUserID+"Test");
    if(!loginedUserID.equals("")){
        System.out.println(loginedUserMeaningID+"cxcxc");
        return true;
    }
    else{
        return false;
    }
}
}

在CustomerPresenter中:

@ProxyCodeSplit
@NameToken(NameTokens.cust)
@UseGatekeeper(MyGateKeeper.class)
public interface MyProxy extends ProxyPlace<CustomerPresenter> {
}
@ProxyCodeSplit
@NameToken(NameTokens.cust)
@UseGatekeeper(MyGateKeeper.class)
公共接口MyProxy扩展了ProxyPlace{
}
但是,在运行之后,即使我登录了,它也不会显示Gui。我测试并发现在调用
PassUserInfoHandler()
之前调用了MyGateKeeper中的
canReveal()
,因此
canReveal
从不
返回true


如何解决此问题?

完成此操作的常用模式是在
单例
中绑定
CurrentUser
类:

bind(CurrentUser.class).in(Singleton.class);
并将其注入您的
网守
。在您的
GateKeeper
方法中,您将检查
currentUser.isLoggedIn()

您应该通过调用服务器来初始化
引导程序中的
CurrentUser.isLoggedIn
字段(请参阅)。下面是一个使用GWTP的
RestDispatch
的示例:

public class BootstrapperImpl implements Bootstrapper {
    private final String unauthorizedPlace;
    private final CurrentUser currentUser;
    private final PlaceManager placeManager;
    private final RestDispatch restDispatch;
    private final UserResource userResource;

    @Inject
    BootstrapperImpl(
            @UnauthorizedPlace String unauthorizedPlace,
            CurrentUser currentUser,
            PlaceManager placeManager,
            RestDispatch restDispatch,
            UserResource userResource) {
        this.unauthorizedPlace = unauthorizedPlace;
        this.currentUser = currentUser;
        this.placeManager = placeManager;
        this.restDispatch = restDispatch;
        this.userResource = userResource;
    }

    @Override
    public void onBootstrap() {
        checkIfUserIsLoggedIn();
    }

    private void checkIfUserIsLoggedIn() {
        restDispatch.execute(userResource.isCurrentUserLoggedIn(), new AbstractAsyncCallback<Boolean>() {
            @Override
            public void onSuccess(Boolean isCurrentUserLoggedIn) {
                navigate(isCurrentUserLoggedIn);
            }
        });
    }

    private void navigate(Boolean isCurrentUserLoggedIn) {
        currentUser.setLoggedIn(isCurrentUserLoggedIn);

        if (isCurrentUserLoggedIn) {
            placeManager.revealCurrentPlace();
        } else {
            placeManager.revealPlace(new PlaceRequest.Builder().nameToken(unauthorizedPlace).build());
        }
    }
}
公共类BootstrapperImpl实现引导程序{
私人最终字符串未经授权的位置;
私有最终CurrentUser CurrentUser;
私人最终配售经理配售经理;
私人最终再调度再调度;
私有最终用户资源用户资源;
@注入
BootstrapperImpl(
@未经授权的放置字符串未经授权的放置,
当前用户当前用户,
PlaceManager PlaceManager,
重新调度重新调度,
用户资源(用户资源){
this.unauthorizedPlace=未经授权的场所;
this.currentUser=currentUser;
this.placeManager=placeManager;
this.restDispatch=restDispatch;
this.userResource=userResource;
}
@凌驾
bootstrap()上的公共无效{
checkIfUserIsLoggedIn();
}
私有void checkIfUserIsLoggedIn(){
restDispatch.execute(userResource.isCurrentUserLoggedIn(),新的AbstractAsyncCallback()){
@凌驾
成功时的公共void(布尔值isCurrentUserLoggedIn){
导航(isCurrentUserLoggedIn);
}
});
}
私有void导航(布尔值isCurrentUserLoggedIn){
currentUser.setLoggedIn(isCurrentUserLoggedIn);
if(isCurrentUserLoggedIn){
placeManager.revealCurrentPlace();
}否则{
placeManager.revealPlace(新PlaceRequest.Builder().nameToken(unauthorizedPlace.build());
}
}
}
public class BootstrapperImpl implements Bootstrapper {
    private final String unauthorizedPlace;
    private final CurrentUser currentUser;
    private final PlaceManager placeManager;
    private final RestDispatch restDispatch;
    private final UserResource userResource;

    @Inject
    BootstrapperImpl(
            @UnauthorizedPlace String unauthorizedPlace,
            CurrentUser currentUser,
            PlaceManager placeManager,
            RestDispatch restDispatch,
            UserResource userResource) {
        this.unauthorizedPlace = unauthorizedPlace;
        this.currentUser = currentUser;
        this.placeManager = placeManager;
        this.restDispatch = restDispatch;
        this.userResource = userResource;
    }

    @Override
    public void onBootstrap() {
        checkIfUserIsLoggedIn();
    }

    private void checkIfUserIsLoggedIn() {
        restDispatch.execute(userResource.isCurrentUserLoggedIn(), new AbstractAsyncCallback<Boolean>() {
            @Override
            public void onSuccess(Boolean isCurrentUserLoggedIn) {
                navigate(isCurrentUserLoggedIn);
            }
        });
    }

    private void navigate(Boolean isCurrentUserLoggedIn) {
        currentUser.setLoggedIn(isCurrentUserLoggedIn);

        if (isCurrentUserLoggedIn) {
            placeManager.revealCurrentPlace();
        } else {
            placeManager.revealPlace(new PlaceRequest.Builder().nameToken(unauthorizedPlace).build());
        }
    }
}