GWT:用使用延迟绑定的自定义映射器替换AbstractPlaceHistoryMapper

GWT:用使用延迟绑定的自定义映射器替换AbstractPlaceHistoryMapper,gwt,history,gwt-history,Gwt,History,Gwt History,看起来为PlaceHistoryMapper生成的类是硬编码的,以使用AbstractPlaceHistoryMapper作为超类 因此,我试图通过使用延迟绑定将AbstractPlaceHistoryMapper替换为我的自定义映射器来解决这个问题。我在*.gwt.xml中使用以下规则: <replace-with class="com.google.gwt.place.impl.AbstractPlaceHistoryMapper"> <when-type-is cl

看起来为PlaceHistoryMapper生成的类是硬编码的,以使用AbstractPlaceHistoryMapper作为超类

因此,我试图通过使用延迟绑定将AbstractPlaceHistoryMapper替换为我的自定义映射器来解决这个问题。我在*.gwt.xml中使用以下规则:

<replace-with class="com.google.gwt.place.impl.AbstractPlaceHistoryMapper">
   <when-type-is class="com.test.sampleapp.CustomPlaceHistoryMapper" />
</replace-with>

但出于某种原因,这种替代似乎没有发生。CustomPlaceHistoryMapper没有被引入,生成的类仍然使用AbstractPlaceHistoryMapper

对于可能导致这种行为的任何想法/建议,我们将不胜感激


注意:我也在GWT组上发布了这个,但到目前为止还没有收到答复。

要使延迟绑定工作,必须使用
GWT.create()
创建一个类。但是,
AbstractPlaceHistoryMapper
仅用作扩展类。因此,它永远不会通过GWT.create创建,而是通过实例化子类来创建。因此,延迟绑定在这种情况下不起作用。如果您想要一个完全不同的实现,您必须实现一个定制的
PlaceHistoryMapper
,并自己管理已知的令牌。这也意味着您也不能使用历史注释


作为补充说明,应该交换规则中的类名。但是对于最终结果来说,这并不重要,因为它在一开始就不起作用。

完全可以使用GWT(2.0)提供的开箱即用的位置相关类来定制历史标记(例如
#mail
#mail/bla
),而不仅仅是
#mail:inbox

您可以实例化默认的
PlaceHistoryMapper
而不是替换
AbstractPlaceHistoryMapper
PlaceHistoryMapper
PlaceHistoryMapperWithFactory
的实现传递给它的构造函数

例如:

然后,您将能够根据需要映射令牌

我个人建议您在mapper自定义实现中使用一个独特的
PlaceTokenizer
,这样我就不必在每个位置都有一个内部的PlaceTokenizer类


希望有帮助。请随时提问。

我认为希尔布兰德的回答是正确的。create(X)表示只有“X”经过“延迟绑定”。如果生成的“X”类扩展了任何类,那么它们(扩展类)将不会执行“延迟绑定”过程。当前(GWT 2.2),如果您使用现成的位置相关类(如AbstractPlaceHistoryMapper等)GWT提供的历史标记的形式只能是prefix:token,例如#mail:inbox。您不能有#mail/inbox,甚至不能只有#mail。显然,这需要增强。目前GWT团队有一个问题需要解决。如果您有兴趣在GWT中实现此功能,请启动它他将在未来发行。
final PlaceHistoryHandler placeHistoryHandler = new PlaceHistoryHandler(new CustomHistoryMapper());