Приложение GWT не может найти подходящий метод из моего интерфейса RequestContext - PullRequest
2 голосов
/ 09 июня 2011

Не могли бы вы мне сказать, в чем моя проблема?У меня есть GWT RequestContext с некоторыми методами и классом обслуживания с реализацией этих методов.Когда я работаю в режиме Dev, мой объект 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) и удаления (CorporateAccount corpAcc), определенными вМой RequestContext, но я их реализую.

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

1 Ответ

2 голосов
/ 09 июня 2011

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

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

InstanceRequest<CorporateAccountProxy, Void> remove();

в вашем CorporateAccountService

public void remove(CorporateAccount corporateAccount)

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

  1. Попробуйте изменить метод так, чтобы они соответствовали
  2. илиесли вы хотите реализовать свои сущности как АКТИВНЫЕ ЗАПИСИ: которые являются сущностями, инкапсулирующими их собственную логику постоянства (как, например, то, что вы сделали с помощью remove ()), то вам следует поместить всю логику, связанную с постоянством, в сам класс Entity.Но вы должны убедиться, что аннотация @Serice нацелена на ваш класс Entity, а не на реализацию вашей службы.

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

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

    public static CorporateAccount findCorporateAccount (Long id)

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

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

...