Gwt 使用RequestFactory';s stableId()作为状态信息?

Gwt 使用RequestFactory';s stableId()作为状态信息?,gwt,requestfactory,gwt-gin,gwt-places,Gwt,Requestfactory,Gwt Gin,Gwt Places,我的GWT应用程序使用RequestFactory以及活动和场所 为了标记RequestFactory的stableId()内部位置,我注入了RequestFactory。这使类能够访问getProxyId(token)和getHistoryToken(stableId)。标记器调用非静态、受保护的方法来标记特定位置 下面是一个示例类 public class StableIdPlace extends Place { @Inject private static Provider<

我的GWT应用程序使用RequestFactory以及活动和场所

为了标记RequestFactory的
stableId()
内部位置,我注入了RequestFactory。这使类能够访问
getProxyId(token)
getHistoryToken(stableId)
。标记器调用非静态、受保护的方法来标记特定位置

下面是一个示例类

public class StableIdPlace extends Place {

  @Inject private static Provider<StableIdPlace> provider;

  private final MyRequestFactory requestFactory;
  private EntityProxyId<StableIdProxy> stableId;

  @Inject
  public StableIdPlace(MyRequestFactory rf) {
    requestFactory = rf;
  }

  public void setStableId(EntityProxyId<StableIdProxy> which) {
    stableId = which;
  }

  public EntityProxyId<StableIdProxy> getStableId() {
    return stableId;
  }

  protected void setFromHistoryToken(String token) {
    stableId = requestFactory.getProxyId(token);
  }

  protected String getHistoryToken() {
    return requestFactory.getHistoryToken(stableId);
  }

  public static class Tokenizer implements PlaceTokenizer<StableIdPlace> {
    @Override
    public String getToken(StableIdPlace place) {
      return place.getHistoryToken();
    }
    @Override
    public StableIdPlace getPlace(String token) {
      StableIdPlace place = provider.get();
      place.setFromHistoryToken(token);
      return place;
  }
}
公共类StabledPlace扩展位置{
@注入私有静态提供者;
私有最终MyRequestFactory requestFactory;
私人实体Proxylid stableId;
@注入
公共停车场(MyRequestFactory rf){
请求工厂=射频;
}
public void setStableId(EntityProxyId which){
stableId=哪个;
}
公共EntityProxyId getStableId(){
返回stableId;
}
受保护的void setFromHistoryToken(字符串标记){
stableId=requestFactory.getProxyId(令牌);
}
受保护的字符串getHistoryToken(){
returnrequestfactory.getHistoryToken(stableId);
}
公共静态类标记器实现PlaceTokenizer{
@凌驾
公共字符串getToken(StableIdPlace place){
return place.getHistoryToken();
}
@凌驾
公共StabledPlace getPlace(字符串令牌){
StableIdPlace place=provider.get();
place.setFromHistoryToken(token);
返回地点;
}
}
该策略需要在任何需要新位置的地方注入提供者。不幸的是,这包括静态令牌化器。

我尝试在Gin客户机模块中使用
requestStaticInjection()
启动静态注入(针对每个Place类)。除了历史记录之外,我所做的工作正常。我无法使静态提供程序初始化。这会在标记器中导致空异常


有更好的方法吗?感谢您的指点。

您可以使用
PlaceHistoryMapperWithFactory
从Ginject、Provider或AssistedInject工厂创建标记器实例


(我宁愿将RF注入标记器而不是位置,位置是关于代理的,标记器是关于历史标记的)

谢谢你,@Thomas。你的建议非常有效。工厂甚至允许我使用相同的抽象标记器(基于你留下的评论)。你回答了我的问题,这也令人惊讶。当我在其他地方按照你的建议行事时,我的问题出现了,仍然没有在代理中公开“真实”的实体id。感谢你在RF方面所做的所有工作。