gwtp - Why canReveal() of GateKeeper was called before the EventHandler was called (GWT)? -
i got header presenter nested presenter. customer presenter child of header presenter (ie customer presenter put slot of header presenter).
so want use mygatekeeper manage login page. headerpresenter fire passuserinfoevent.
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; } }
}
in customerpresenter:
@proxycodesplit @nametoken(nametokens.cust) @usegatekeeper(mygatekeeper.class) public interface myproxy extends proxyplace<customerpresenter> { }
however after run, not show gui loggined. tested & found canreveal()
in mygatekeeper called before passuserinfohandler()
called, canreveal
never return true
;
how fix problem?
the usual pattern accomplish bind currentuser
class in singleton
:
bind(currentuser.class).in(singleton.class);
and inject gatekeeper
. inside gatekeeper
's canreveal
method, you'll check currentuser.isloggedin()
:
private final currentuser currentuser; @inject mygatekeeper(currentuser currentuser) { this.currentuser = currentuser; } @override public boolean canreveal() { return currentuser.isloggedin(); }
you should initialize currentuser.isloggedin
field inside bootstrapper
(see https://github.com/arcbees/gwtp/wiki/bootstrapping-or-application-initialization) calling server. here's example using gwtp's 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()); } } }
Comments
Post a Comment