Приложение GWT не может найти соответствующий метод из моего интерфейса RequestContext

Не могли бы вы сказать мне, пожалуйста, в чем моя проблема? У меня есть GWT RequestContext с некоторыми методами и некоторый класс обслуживания с реализацией этих методов. Когда я работаю в режиме разработки, мой объект RequestContext не проходит проверку.

Вот интерфейс RequestContext:

@Service(value = CorporateAccountService.class, locator = CorporateAccountServiceLocator.class)

public interface CorporateAccountServiceRequest extends RequestContext {
  Request<List<CorporateAccountProxy>> findAllCorporateAccounts();
  Request<CorporateAccountProxy> findCorporateAccount(Long id);
  InstanceRequest<CorporateAccountProxy, Void> persist();
  InstanceRequest<CorporateAccountProxy, Void> remove();
}

а вот реализация, указанная ServiceLocator:

public class CorporateAccountService {

public void persist(CorporateAccount corporateAccount) {
    EntityManager em = EMF.get().createEntityManager();
    try {
        em.persist(corporateAccount);
    } finally {
        em.close();
    }
}

public void remove(CorporateAccount corporateAccount) {
    EntityManager em = EMF.get().createEntityManager();
    try {
        CorporateAccount attached = em.find(CorporateAccount.class,
                corporateAccount.getId());
        em.remove(attached);
    } finally {
        em.close();
    }
}

@SuppressWarnings("unchecked")
public List<CorporateAccount> findAllCorporateAccounts() {
    EntityManager em = EMF.get().createEntityManager();
    try {
        List<CorporateAccount> list = em.createQuery(
                "FROM CorporateAccount").getResultList();
        // force to get all the employees
        list.size();
        return list;
    } finally {
        em.close();
    }

}

public CorporateAccount findCorporateAccount(Long id) {
    EntityManager em = EMF.get().createEntityManager();
    try {
        return em.find(CorporateAccount.class, id);
    } finally {
        em.close();
    }
}

}

Я получаю эту ошибку о проверке контекста запроса:

Jun 9, 2011 7:32:10 PM com.dms.admin.shared.CorporateAccountServiceRequest com.google.web.bindery.requestfactory.shared.InstanceRequest remove()
SEVERE: Could not find matching method in com.dms.admin.server.CorporateAccountService.
Possible matches:
    void remove(com.dms.admin.server.domain.CorporateAccount )

Jun 9, 2011 7:32:10 PM com.dms.admin.shared.CorporateAccountServiceRequest   com.google.web.bindery.requestfactory.shared.InstanceRequest persist()
SEVERE: Could not find matching method in com.dms.admin.server.CorporateAccountService.
Possible matches:
    void persist(com.dms.admin.server.domain.CorporateAccount )

Jun 9, 2011 7:32:10 PM com.google.web.bindery.requestfactory.server.ServiceLayerDecorator die
SEVERE: The RequestContext type com.dms.admin.shared.CorporateAccountServiceRequest did     not pass validation
Jun 9, 2011 7:32:10 PM  com.google.web.bindery.requestfactory.server.RequestFactoryServlet doPost
SEVERE: Unexpected error
com.google.web.bindery.requestfactory.server.UnexpectedException: The RequestContext  type com.dms.admin.shared.CorporateAccountServiceRequest did not pass validation

У него есть некоторые проблемы с методами persist(CorporateAccount corpAcc) и remove(CorporateAccount corpAcc), определенными в моем RequestContext, но я их реализую.

Заранее спасибо, я ценю вашу помощь.


person George    schedule 09.06.2011    source источник
comment
вы должны были добавить больше тегов. Это делает вопрос более заметным   -  person Pedro Rolo    schedule 10.06.2011


Ответы (1)


Вы должны внимательно прочитать логи, они довольно информативны:

в вашем контексте запроса CorporateAccountServiceRequest у вас есть следующая подпись:

InstanceRequest<CorporateAccountProxy, Void> remove();

в CorporateAccountService у вас есть

public void remove(CorporateAccount corporateAccount)

Методы должны совпадать, потому что CorporateAccountServiceRequest — это прокси (представляющий интерфейс) вашей службы на стороне клиента. Если они не совпадают, то это не нормально. Я предполагаю, что другие журналы также похожи на этот, так что продолжайте читать... Чтобы исправить это, вы должны:

  1. Попробуйте изменить метод так, чтобы они совпадали
  2. или если вы хотите реализовать свои объекты как ACTIVE RECORDS : которые являются объектами, инкапсулирующими свою собственную логику сохранения (например, то, что вы сделали с remove()), тогда вы должны поместить всю логику, связанную с сохранением, в сам класс Entity. Но вы должны убедиться, что аннотация @Serice нацелена на ваш класс Entity, а не на реализацию службы.

Вы также должны проверить некоторые из следующих правил при работе с REquestFactory:

  1. Убедитесь, что ваши классы Entity имеют столбцы @version и @Id и соответствующие геттеры/сеттеры. Столбец версии используется requestFactory для проверки того, совпадает ли состояние, отображаемое на стороне клиента, с состоянием на сервере.
  2. Убедитесь, что вы определили в своей службе метод static с именем findXXX(Long id), где XXX — это имя вашего объекта. В вашем случае, я думаю, это должно быть похоже на stg

    public static CorporateAccount findCorporateAccount(длинный идентификатор)

  3. не теряй веру ;-)

Надеюсь, это помогло...

person kaffein    schedule 09.06.2011
comment
Спасибо, я решил проблему. Предполагалось, что это будет так: Request‹Void› persist(CorporateAccountProxy accountProxy); Запрос‹Void› удалить(CorporateAccountProxy accountProxy); Вместо этого: InstanceRequest‹CorporateAccountProxy, Void› persist(); InstanceRequest‹CorporateAccountProxy, Void› remove(); Я не помнил, что InstanceRequests используются только тогда, когда логика персистентности реализована в самих сущностях. - person George; 09.06.2011
comment
@ user791195 Вы должны принять этот ответ или создать новый ответ на этот комментарий. - person Roalt; 16.06.2011