2011-10-03 32 views
0

您好我試圖從Google數據存儲檢索linkedhashset,但似乎沒有發生。我想在網頁上使用GWT在網格中顯示結果。我已經把system.out.println()放在所有的類中,看看我出錯的地方,但它只顯示一個,我也沒有收到任何錯誤。我在服務器包(ContactDAOJdo/ContactServiceImpl)中使用6個類2,在客戶端包(ContactService/ContactServiceAsync/ContactListDelegate/ContactListGui)中使用4個。我希望有人能夠解釋爲什麼這不起作用,並指向正確的方向。通過serviceimpl從數據存儲GWT檢索列表

public class ContactDAOJdo implements ContactDAO { 
    @SuppressWarnings("unchecked") 
    @Override 
    public LinkedHashSet<Contact> listContacts() { 
    PersistenceManager pm = PmfSingleton.get().getPersistenceManager(); 
    String query = "select from " + Contact.class.getName(); 
    System.out.print("ContactDAOJdo: "); 
    return (LinkedHashSet<Contact>) pm.newQuery(query).execute(); 
    } 
} 

public class ContactServiceImpl extends RemoteServiceServlet implements ContactService{ 
    private static final long serialVersionUID = 1L; 
    private ContactDAO contactDAO = new ContactDAOJdo() { 
    @Override 
    public LinkedHashSet<Contact> listContacts() { 
    LinkedHashSet<Contact> contacts = contactDAO.listContacts(); 
    System.out.println("service imp "+contacts); 
    return contacts; 
    } 
} 

@RemoteServiceRelativePath("contact") 
public interface ContactService extends RemoteService { 
    LinkedHashSet<Contact> listContacts(); 
} 

public interface ContactServiceAsync { 
    void listContacts(AsyncCallback<LinkedHashSet <Contact>> callback); 
} 

public class ListContactDelegate { 
private ContactServiceAsync contactService = GWT.create(ContactService.class); 
ListContactGUI gui; 
void listContacts(){ 
    contactService.listContacts(new AsyncCallback<LinkedHashSet<Contact>>() { 
     public void onFailure(Throwable caught) { 
      gui.service_eventListContactenFailed(caught); 
      System.out.println("delegate "+caught); 
     } 
     public void onSuccess(LinkedHashSet<Contact> result) { 
      gui.service_eventListRetrievedFromService(result); 
      System.out.println("delegate "+result); 
     } 
    }); 
} 
} 

public class ListContactGUI { 
protected Grid contactlijst; 
protected ListContactDelegate listContactService; 
private Label status; 

public void init() { 
    status = new Label(); 
    contactlijst = new Grid(); 
    contactlijst.setVisible(false); 
    status.setText("Contact list is being retrieved"); 
    placeWidgets(); 

} 

public void service_eventListRetrievedFromService(LinkedHashSet<Contact> result){ 
    System.out.println("1 service eventListRetreivedFromService "+result); 
    status.setText("Retrieved contactlist list"); 
    contactlijst.setVisible(true); 
    this.contactlijst.clear(); 
    this.contactlijst.resizeRows(1 + result.size()); 
    int row = 1; 
    this.contactlijst.setWidget(0, 0, new Label ("Voornaam")); 
    this.contactlijst.setWidget(0, 1, new Label ("Achternaam")); 
    for(Contact contact: result) { 
     this.contactlijst.setWidget(row, 0, new Label (contact.getVoornaam())); 
     this.contactlijst.setWidget(row, 1, new Label (contact.getVoornaam())); 
     row++; 
     System.out.println("voornaam: "+contact.getVoornaam()); 
    } 
    System.out.println("2 service eventListRetreivedFromService "+result); 
} 

public void placeWidgets() { 
    System.out.println("placewidget inside listcontactgui" + contactlijst); 
    RootPanel.get("status").add(status); 
    RootPanel.get("contactlijst").add(contactlijst); 
} 

public void service_eventListContactenFailed(Throwable caught) { 
    status.setText("Unable to retrieve contact list from database."); 
} 
} 

回答

1

它可能是查詢返回一個懶惰列表。這意味着在列表發送給客戶的時候列表中並不是所有的值都在列表中。我用一招,只需要調用size()名單(不知道我是如何得到該解決方案,但似乎工作):

public LinkedHashSet<Contact> listContacts() { 
    final PersistenceManager pm = PmfSingleton.get().getPersistenceManager(); 
    try {   
    final LinkedHashSet<Contact> contacts = 
     (LinkedHashSet<Contact>) pm.newQuery(Contact.class).execute(); 
    contacts.size(); // this triggers to get all values. 
    return contacts; 
    } finally { 
    pm.close(); 
    } 

}

但我不知道這是最好的練習...