在我的 gwt-app 中,我有一些地方共享除前缀之外的所有内容(例如“editUserPlace”和“showUserPlace” - 在这种情况下,状态由 userId 确定) 我当前的尝试是通过“ShowUserPlace”和“EditUserPlace”扩展抽象的“UserPlace”,它们仅在一行中有所不同:@Prefix(“showUser”)/@Prefix(“editUser”) - 必须复制孔标记生成器代码(我无法继承分词器代码,但可以覆盖前缀)。
在 https://groups.google.com/d/topic/google-web-toolkit/pghMLX27Y4Y/discussion托马斯建议使用“PlaceHistoryMapperWithFactory”,但我坚持使用它。
我是否必须为每个地方/标记器提供一种方法(也为“正常”的地方 - 提供自己的标记器)? 我是否必须将我的 Abstract 和/或扩展类添加到 @WithTokenizer? 我应该如何/在哪里调用 setFactory?
有人使用过 PlaceHistoryMapperWithFactory (可能在类似的用例中)?并给一些建议? 有人遇到同样的问题并以另一种方式解决吗?
最佳答案
该工厂应该可以工作:
class MyFactory {
@Prefix("showUser")
public PlaceTokenizer<ShowUserPlace> showUserPlace() {
return new UserPlaceTokenizer<ShowUserPlace>() {
protected ShowUserPlace createPlace(String id) {
return new ShowUserPlace(id);
}
};
}
@Prefix("showUser")
public PlaceTokenizer<EditUserPlace> showUserPlace() {
return new UserPlaceTokenizer<EditUserPlace>() {
protected EditUserPlace createPlace(String id) {
return new EditUserPlace(id);
}
};
}
}
abstract class UserPlaceTokenizer<P extends UserPlace> implements PlaceTokenizer<P> {
public P getPlace(String token) {
// shared logic between both places: parses ID (or whatever) from token
return createPlace(id);
}
public String getToken(P place) {
// shared logic between both places: build token out of place
return token;
}
protected abstract P createPlace(String id);
}
当然你也可以注入(inject)某种Provider<P>
在标记生成器中,而不是对其进行子类化以覆盖其 createPlace
方法。
您可以将其与 @WithTokenizers
一起使用,如果生成器找到完全相同的位置或前缀的两个分词器,则生成器将会阻塞。
您应该调用setFactory
就在你之后GWT.create()
你的映射器(实际上,重要的是你在调用映射器的 getPlace
或 getToken
方法之前设置工厂)。
关于java - 共享除前缀之外的所有地点或如何使用 PlaceHistoryMapperWithFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10089964/