GWT通过serviceimpl从数据存储中检索列表

时间:2011-10-03 22:20:00

标签: user-interface gwt delegates gwt-rpc

您好我正在尝试从Google数据存储中检索一个linkhashset,但似乎没有任何事情发生。我想在页面上使用GWT在Grid中显示结果。我已将system.out.println()放在所有类中以查看我出错的地方,但它只显示一个,我没有收到任何错误。我在服务器包(ContactDAOJdo / ContactServiceImpl)中使用6个类2,在客户端包中使用4个(ContactService / ContactServiceAsync / ContactListDelegate / ContactListGui)。我希望有人可以解释为什么这不起作用,并指出我正确的方向。

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 个答案:

答案 0 :(得分: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();
  }

}

但我不确定这是不是最佳做法......