2011-09-07 80 views
3

我們試圖將RequestFactory與現有的Java實體模型結合使用。我們的Java實體的所有實施DomainObject接口和暴露getObjectId()方法(這個名字被選爲getId()可能會模棱兩可,並與域對象的實際從域ID衝突建模。我可以在不使用getId()和getVersion()方法的情況下使用RequestFactory嗎?

ServiceLayerDecorator接口允許的定製。ID以及版本屬性查找策略

public class MyServiceLayerDecorator extends ServiceLayerDecorator { 
    @Override 
    public Object getId(Object object) { 
     DomainObject domainObject = (DomainObject) object; 
     return domainObject.getObjectId(); 
    } 
} 

到目前爲止,一切都很好。然而,嘗試部署該解決方案的產量運行時錯誤尤其RequestFactoryInterfaceValidator抱怨:

[ERROR] There is no getId() method in type com.mycompany.server.MyEntity 

再後來就:

[ERROR] Type type com.mycompany.client.MyEntityProxy was previously marked as bad 
[ERROR] The type com.mycompany.client.MyEntityProxy did not pass RequestFactory validation 
[ERROR] Unexpected error 
com.google.web.bindery.requestfactory.server.UnexpectedException: The type com.mycompany.client.MyEntityProxy did not pass RequestFactory validation 
    at com.google.web.bindery.requestfactory.server.ServiceLayerDecorator.die(ServiceLayerDecorator.java:212) ~[gwt-servlet.jar:na] 

我的問題是 - 爲何ServiceLayerDecorator允許自定義ID和版本查找策略如果RequestFactoryInterfaceValidator是硬編碼的getId()getVersion()公約?

我想我可以覆蓋ServiceLayerDecorator.resolveClass()忽略「中毒」的代理類,但在這一點上似乎是我打的框架太多...

+0

通過'RequestFactoryInterfaceValidator'挖掘並重新閱讀文檔後,似乎我可能需要在這裏使用自定義的'Locator'類型... – Eric

+0

然而,一個更基本的問題是適用的。如果我仍然需要用定義這種行爲的特定Locator來標記每個EntityProxy,那麼在ServiceLayerDecorator中允許全局重寫'getId()'和'getVersion()'有什麼用? – Eric

回答

3

夫婦的選擇,其中一些已經提及:

  • Locator。我喜歡爲整個項目製作一個定位器,或者至少爲具有相似鍵類型的相關對象組創建一個定位器。 getId()調用將能夠調用您的DomainObject.getObjectId()方法並返回該值。請注意,getDomainType()方法當前未被使用,並且可以返回null或拋出異常。
  • ValueProxy。而不是將你的對象映射到RF可以理解爲一個實體的東西,將它們映射爲普通值對象 - 不需要標識或版本。射頻漏掉了很多聰明的事情,尤其是在避免向服務器發送冗餘數據方面。
  • ServiceLayerDecorator。這在2.4之前就行得通了,但是現在進行的註釋處理工作不太好,因爲它試圖爲你做一些工作。看起來ServiceLayerDecorator在過去幾個月裏已經失去了很多優勢 - 理論上來說,你可以用它來重建getter來直接與你的持久機制對話,但是現在註釋處理驗證你的代碼,這已經不再是一種選擇了。

在這一切的大問題是,RequestFactory旨在解決一個問題,解決得好:允許開發人員使用映射到一些持久性機制的POJO,並從客戶端是指那些對象,遵循一定約定來避免編寫額外的代碼或配置。

因此,它很好地解決了自己的問題,最終導致很難適應其他許多問題/用例。你可能會發現它是不值得的:如果是這樣,你可能會考慮一些想法:

  • RPC。這並不完美,但它確實是一個很好的工作。
  • AutoBeans(RF基於)仍然是一種相當快速,輕量級的方式,通過電線發送數據並將其傳送到應用程序中。你可以圍繞它構建你自己的包裝,就像RF已經完成的一樣,並且減少它正在試圖解決的問題,只是你的用例。
相關問題