【问题标题】:GWT app cannot find matching method from my RequestContext interfaceGWT 应用程序无法从我的 RequestContext 接口中找到匹配的方法
【发布时间】:2026-01-24 01:40:01
【问题描述】:

请问我的问题是什么?我有 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

我的 RequestContext 中定义的 persist(CorporateAccount corpAcc) 和 remove(CorporateAccount corpAcc) 方法存在一些问题,但我正在实现它们。

提前感谢您,感谢您的帮助。

【问题讨论】:

  • 您应该添加更多标签。它使问题更加明显

标签: java gwt requestfactory


【解决方案1】:

你应该仔细阅读日志,它们信息量很大:

在您的 CorporateAccountServiceRequest 请求上下文中,您具有以下签名:

InstanceRequest<CorporateAccountProxy, Void> remove();

在 CorporateAccountService 你有

public void remove(CorporateAccount corporateAccount)

方法必须匹配,因为 CorporateAccountServiceRequest 是客户端服务的代理(代表接口)。如果它们不匹配,那就不行了。 我猜其他日志也和这个一样,所以请继续阅读...... 为了纠正它,你应该:

  1. 尝试更改方法以使其匹配
  2. 或者如果您想将实体实现为活动记录:这些实体封装了自己的持久性逻辑(就像您使用 remove() 所做的那样),那么您应该将所有与持久性相关的逻辑放在实体类本身中。但是您必须确保 @Serice 注释针对您的 Entity 类而不是您的 Service 实现。

在处理 REquestFactory 时,您还应该检查以下一些规则:

  1. 确保您的实体类具有@version 和@Id 列以及它们各自的getter/setter。版本列被requestFactory用来检查客户端显示的状态是否与服务端一致。
  2. 确保您在服务中定义一个名为 findXXX(Long id)静态 方法,其中 XXX 是您的实体名称。在你的情况下,我想它必须像

    public static CorporateAccount findCorporateAccount(Long id)

  3. 不要失去信心 ;-)

我希望这会有所帮助...

【讨论】:

  • 谢谢我解决了这个问题。它应该是这样的: Request persist(CorporateAccountProxy accountProxy); Request remove(CorporateAccountProxy accountProxy);而不是这个:InstanceRequest persist(); InstanceRequest remove();我不记得只有在实体本身实现持久性逻辑时才使用 InstanceRequests。
  • @user791195 你应该接受这个答案或者在这个评论中创建一个新的答案。
最近更新 更多