我全新的遊標,並具有以下方法:GWT從服務器與RequestFactory客戶通過物化光標,並顯示在DataGrid中多個頁面
public List<Venue> findPage(Subject subject, Objectify ofy, int pageSize) {
final Business business = (Business) subject.getSession().getAttribute(BUSINESS_ATTRIBUTE);
final Query<Venue> query = ofy.query(Venue.class).filter(BUSINESS_ATTRIBUTE, business);
final String encodedCursor = (String) subject.getSession().getAttribute(VENUE_CURSOR_CONDITION);
if (encodedCursor != null) {
query.startCursor(Cursor.fromWebSafeString(encodedCursor));
}
final QueryResultIterator<Key<Venue>> iterator = query.fetchKeys().iterator();
final List<Key<Venue>> data = new ArrayList<Key<Venue>>(pageSize);
boolean more = false;
for (int i = 0; i < pageSize && (more = iterator.hasNext()); i++) {
data.add(iterator.next());
}
subject.getSession().setAttribute(VENUE_CURSOR_CONDITION, iterator.getCursor().toWebSafeString());
return get(ofy, data);
}
那裏得到的是下面的方法
public <T> List<T> get(Objectify ofy, List<Key<T>> keys) {
if (keys == null) {
return null;
}
final Map<Key<T>, T> map = ofy.get(keys);
final List<T> list = new ArrayList<T>();
for (T t : map.values()) {
list.add(t);
}
return list;
}
現在,這是我目前正在做的 - 這是一個有點hackish。我正在使用Apache Shiro來跟蹤用戶的會話 - 在用戶的會話中,我保留最後使用的遊標 - 如果用戶從頁面導航離開頁面,我將光標設置爲false(顯然 - 這是非常非常脆弱的,因爲它需要每個方法都有一個代碼來使最後一個遊標無效)。
現在,這裏是我被抓到的地方。我做了一個簡單的HasCursor接口,並且將要傳回帶有Cursor的List到客戶端 - 唯一的問題是RequestFactory只能處理從服務器到客戶端的某些類型的傳遞 - 這個Custom類型不是其中之一。所以,現在使用GWT RequestFactory - 是否有一種將Objectify光標從服務器傳遞到客戶端的好方法?
另外 - 我遇到的另一個問題 - 如果我用這個數據填充DataGrid它顯示網格中的數據罰款 - 但就是這樣 - 尋呼機說25-25中的1-25。所以,我想知道的是,你如何確實告訴DataGrid服務器上有更多可用的數據。我有點困惑,因爲似乎沒有很多文檔/例子可用於此。
非常感謝您
給其他人,運行到這個問題,我找到了答案,以它的一個組成部分 - 我忘了所有關於ValueProxies,使您可以映射標準的Java bean返回來自服務器的客戶端與RequestFactory。
不幸的是,你不能將泛型與ValueProxies一起使用,所以我不得不爲每種類型創建一個ListCursor包裝。
這裏的代理:
@ProxyFor(value = VenueListCursorWrapper.class)
public interface VenueListCursorWrapperProxy extends ValueProxy {
List<VenueProxy> getVenues();
String getCursor();
boolean isMoreAvailable();
void setVenues(List<VenueProxy> venues);
void setCursor(String cursor);
void setMoreAvailable(boolean moreAvailable);
}
和這裏的服務器上的更新方法:
public VenueListCursorWrapper findPage(Subject subject, Objectify ofy, int pageSize, String cursor) {
final Business business = (Business) subject.getSession().getAttribute(BUSINESS_ATTRIBUTE);
final Query<Venue> query = ofy.query(Venue.class).filter(BUSINESS_ATTRIBUTE, business);
if (cursor != null) {
query.startCursor(Cursor.fromWebSafeString(cursor));
}
final QueryResultIterator<Key<Venue>> iterator = query.fetchKeys().iterator();
final List<Key<Venue>> data = new ArrayList<Key<Venue>>(pageSize);
boolean more = false;
for (int i = 0; i < pageSize && (more = iterator.hasNext()); i++) {
data.add(iterator.next());
}
return new VenueListCursorWrapper(get(ofy, data), iterator.getCursor().toWebSafeString(), more);
}
所以 - 這是它的一部分 - 有一件事我仍然還沒有完全想通了如何做是讓頁面設置正確 - 我想顯示在尋呼機中的項目的總數,讓您通過它,但我不知道如何做到這一點 - 但如果我找到解決方案我將發佈它
嗯 - 這就是問題 - 使用RequestFactory我不知道如何返回它 - 使用RequestFactory,好像我無法將兩者一起返回 - 從請求工廠網站它說我只能返回原語,盒裝原語,其他(枚舉,大整數,大小數,日期),值/實體的代理,和設置/列表 - 我無法弄清楚如何將字符串返回列表,因爲我無法傳回包含一個列表和一個字符串的對象 –