看起来为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小组上发布了这个,但到目前为止还没有收到答案。
答案 0 :(得分:1)
要使延迟绑定工作,必须使用GWT.create()
创建一个类。但是,AbstractPlaceHistoryMapper
仅用作扩展类。因此它永远不会通过GWT.create创建,但总是通过实例化子类。因此,延迟绑定在这种情况下不起作用。如果您需要完全不同的实现,则必须实现自定义PlaceHistoryMapper
,并自行管理已知令牌。这也意味着您也无法使用历史注释。
作为旁注,应该交换规则中的类名。但是最终的结果并不重要,因为它不会起作用。
答案 1 :(得分:0)
绝对有可能使用自定义历史记录令牌(例如。#mail
或#mail/bla
而非#mail:inbox
),使用与GWT相关的现成的与地点相关的类(2.0)提供。
您可以实例化AbstractPlaceHistoryMapper
或PlaceHistoryMapper
的实现,而不是替换PlaceHistoryMapper<T>
,您可以实例化默认PlaceHistoryMapperWithFactory<T>
传递它的构造函数。
例如:
final PlaceHistoryHandler placeHistoryHandler = new PlaceHistoryHandler(new CustomHistoryMapper());
然后,您可以根据需要映射令牌。
我个人建议您在映射器自定义实现中使用唯一的PlaceTokenizer
,这样我就不必在每个 Places PlaceTokenizer 类>
希望有所帮助。随意提出任何疑问。