2011-06-09 20 views
2

請問我請問我的問題是什麼?我有GWT的RequestContext與它的一些方法和一些服務類與該方法的實現。當我在開發模式下運行時,我的RequestContext對象不能通過驗證。GWT應用程序無法從我的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(); 
} 

,這裏是由服務定位器規定的實施:

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)方法存在一些問題,但我正在實施它們。

非常感謝您的幫助。

+0

您應該添加更多標籤。它使問題更加明顯 – 2011-06-10 13:03:33

回答

2

您應仔細閱讀日誌,他們是非常翔實:

在CorporateAccountServiceRequest請求上下文

你有以下特徵:

InstanceRequest<CorporateAccountProxy, Void> remove(); 
在CorporateAccountService

你有

public void remove(CorporateAccount corporateAccount) 

這些方法必須匹配,因爲CorporateAccountServiceRequest是客戶端S上的服務的代理(代表接口) IDE。如果他們不匹配,那就不好。 我想其他的日誌也是這樣一個如此繼續閱讀... 爲了糾正它,你應該:

  1. 試圖改變方法,以便它們匹配
  2. 或者,如果你想將實體作爲活動記錄來實現:哪些是實體封裝自己的生存邏輯(就像你用remove()所做的那樣),那麼你應該把所有與持久相關的邏輯放在實體類本身中。但是你必須確保@Serice註解的目標是你的實體類而不是你的服務實現。

你也應該REquestFactory打交道時,請檢查下面的一些規則:

  1. 確保您的實體類有@version和@Id列及其各自的getter/setter方法。 VersionFactory使用Version列來檢查客戶端上顯示的狀態是否與服務器上的狀態相同。
  2. 確保你在你的服務定義了一個名爲的findxxx(長ID),其中XXX爲你的實體的名稱靜態方法。在你的情況,我想它必須像英鎊

    公共靜態CorporateAccount findCorporateAccount(長ID)

  3. 不要失去信心;-)

我希望這有助於...

+2

謝謝我解決了這個問題。它應該是這樣的: 請求堅持(CorporateAccountProxy accountProxy); 請求刪除(CorporateAccountProxy accountProxy); 而不是: InstanceRequest persist(); InstanceRequest remove(); 我不記得只有當實體本身實現了持久性邏輯時才使用InstanceRequests。 – George 2011-06-09 17:45:00

+0

@ user791195您應該接受此答案,或爲此評論創建一個新答案。 – Roalt 2011-06-16 07:55:33

相關問題