アプリの楽観的ロックに対する別の回避策を考え出しました。プロキシ自体でバージョンを渡すことができないため ( Thomas が説明したように)、 HTTP GETパラメーターを介してリクエスト ファクトリに渡します。
クライアントで:
MyRequestFactory factory = GWT.create( MyRequestFactory.class );
RequestTransport transport = new DefaultRequestTransport() {
@Override
public String getRequestUrl() {
return super.getRequestUrl() + "?version=" + getMyVersion();
}
};
factory.initialize(new SimpleEventBus(), transport);
サーバー上で ServiceLayerDecorator を作成し、以下からバージョンを読み取りますRequestFactoryServlet.getThreadLocalRequest()
。
public static class MyServiceLayerDecorator extends ServiceLayerDecorator {
@Override
public final <T> T loadDomainObject(final Class<T> clazz, final Object domainId) {
HttpServletRequest threadLocalRequest = RequestFactoryServlet.getThreadLocalRequest();
String clientVersion = threadLocalRequest.getParameter("version") );
T domainObject = super.loadDomainObject(clazz, domainId);
String serverVersion = ((HasVersion)domainObject).getVersion();
if ( versionMismatch(serverVersion, clientVersion) )
report("Version error!");
return domainObject;
}
}
利点は、loadDomainObject()
変更が RF によってドメイン オブジェクトに適用される前に呼び出されることです。
この場合、1 つのエンティティを追跡しているだけなので、1 つのバージョンを使用していますが、アプローチは複数のエンティティに拡張できます。