getId()およびgetVersion()メソッドなしでrequestFactoryを使用できますか?
-
27-10-2019 - |
質問
使用しようとしています RequestFactory
既存のJavaエンティティモデルを使用。私たちのJavaエンティティはすべてaを実装します DomainObject
インターフェイスと露出a getObjectId()
メソッド(この名前はとして選択されました getId()
曖昧でドメインオブジェクトと競合する可能性があります 実際 モデリングされているドメインからのID。
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()
「毒された」プロキシクラスを無視するには、この時点でフレームワークと戦っているようです...
解決
いくつかのオプション、そのうちのいくつかはすでに言及されています:
Locator
. 。 ProJ全体の単一のロケーター、または少なくとも同様のキータイプを持つ関連するオブジェクトのグループのために作成するのが好きです。 getID()コールは、domainobject.getObjectId()メソッドを呼び出し、その値を返すことができます。に注意してくださいgetDomainType()
メソッドは現在未使用であり、nullを返すか、例外をスローできます。ValueProxy
. 。オブジェクトをRFがエンティティとして理解できるものにマッピングする代わりに、それらをプレーンバリューオブジェクトにマッピングします - IDやバージョンは必要ありません。 RFは、特にサーバーに冗長データを送信することを避けることに関して、できることができる多くの賢いことを見逃しています。ServiceLayerDecorator
. 。これは2.4以前に機能しましたが、現在進行中の注釈処理では、それがあなたのためにいくつかの仕事をしようとするので、それはあまりうまく機能しません。 Servicelayerdecoratorはここ数か月で多くの歯を失ったようです。理論的には、Gettersを再構築して永続メカニズムに直接通信することができますが、注釈処理がコードを検証した今、それはオプションではなくなりました。 。
このすべての大きな問題は、RequestFactoryが単一の問題を解決し、それをうまく解決するように設計されていることです。開発者がマッピングされたPojosを永続的なメカニズムに使用できるようにし、特定の規則に従って、クライアントからのオブジェクトを参照して、追加のコードを書くことを避けないようにすることです。または構成。
その結果、それはそれ自体の問題をかなりうまく解決し、他の多くの問題/ユースケースに適していることになります。あなたはそれが価値がないことに気付くかもしれません:もしそうなら、あなたが考慮するかもしれないいくつかの考えは次のとおりです:
- RPC。それはあまり完璧ではありませんが、それは多くのために大丈夫な仕事をします。
- AutoBeans(RFが基づいている)は、ワイヤー上にデータを送信してアプリに入れるための非常に高速で軽量な方法です。 RFが行ったように、独自のラッパーを構築することができ、ユースケースだけを解決しようとしている問題をスリムにします。