GWT извлекает список из хранилища данных через serviceimpl - PullRequest
0 голосов
/ 04 октября 2011

Привет. Я пытаюсь получить связанный хэш-сет из хранилища данных Google, но, похоже, ничего не происходит.Я хочу отображать результаты в сетке, используя GWT на странице.Я поместил system.out.println () во все классы, чтобы увидеть, где я ошибаюсь, но он показывает только один, и я не получаю никаких ошибок.Я использую 6 классов 2 в пакете сервера (ContactDAOJdo / ContactServiceImpl) и 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 Ответ

1 голос
/ 04 октября 2011

Это может быть запрос возвращает ленивый список.Это означает, что не все значения находятся в списке на момент отправки списка клиенту.Я использовал трюк, чтобы просто вызвать 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();
  }

}

Но я неуверен, что это лучшая практика ...

...