AutoBean deserialization facing problem with "EntityProxyId<UserProxy> stableId()"

315 views
Skip to first unread message

Andy

unread,
Apr 26, 2011, 11:42:11 AM4/26/11
to Google Web Toolkit
Hi,

I am trying to serialize and deserialize to and from json using
AutoBean as per the link
http://code.google.com/p/google-web-toolkit/wiki/AutoBean

I have the following classes
---------------------------------------------------------------------------------------------
@ProxyFor(User.class)
public interface UserProxy extends EntityProxy {

@Override
EntityProxyId<UserProxy> stableId();

String getId();

void setId(String id);

void setUserName(String userName);

String getUserName();

String getEmail();

void setEmail(String email);

}
---------------------------------------------------------------------------------------------
@Category(EntityProxyCategory.class)
public interface GTAutoBeanFactory extends AutoBeanFactory {

//AutoBean<UserProxy> userProxy();

AutoBean<UserProxy> userProxy(UserProxy toWrap);
}
---------------------------------------------------------------------------------------------
// copied from the URL, I don't have much understanding on this....
public class EntityProxyCategory {
EntityProxyId<?> stableId(AutoBean<EntityProxy> instance) {
return (EntityProxyId<?>) instance.getTag("stableId");
}
}
---------------------------------------------------------------------------------------------

//Serialize: (This has no problem)
//-----------------------------------------------
AutoBean<UserProxy> bean = AutoBeanUtils.getAutoBean(user);
String result = AutoBeanCodex.encode(bean).getPayload();

// The result string is as below
//
{"email":"te...@gmail.com","id":"4db6be71653a25e72154028c","userName":"test"}


//Deserialize:
//------------------
UserProxy user = AutoBeanCodex.decode(injector.getGTAutoBeanFactory(),
UserProxy.class, result).as();




However, when deserializing, I get the following error
23:08:49.604 [ERROR] [gettag] Failed to create an instance of
'com.gettag.client.GetTagClientModule$WebStorageProvider' via deferred
binding

java.lang.IllegalArgumentException: The AutoBeanFactory cannot create
a com.gettag.shared.proxies.UserProxy
at com.google.gwt.autobean.shared.AutoBeanCodex
$Decoder.push(AutoBeanCodex.java:240)
at com.google.gwt.autobean.shared.AutoBeanCodex
$Decoder.decode(AutoBeanCodex.java:50)
at
com.google.gwt.autobean.shared.AutoBeanCodex.decode(AutoBeanCodex.java:
505)
at
com.google.gwt.autobean.shared.AutoBeanCodex.decode(AutoBeanCodex.java:
521)
at com.gettag.client.resources.WebStorage.&lt;init&gt;
(WebStorage.java:30) <------------------ this is actually the
Deserialize line
at com.gettag.client.GetTagClientModule
$WebStorageProvider.&lt;clinit&gt;(GetTagClientModule.java:52)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at
com.google.gwt.dev.shell.ModuleSpace.loadClassFromSourceName(ModuleSpace.java:
654)
at
com.google.gwt.dev.shell.ModuleSpace.rebindAndCreate(ModuleSpace.java:
458)
at
com.google.gwt.dev.shell.GWTBridgeImpl.create(GWTBridgeImpl.java:49)
at com.google.gwt.core.client.GWT.create(GWT.java:98)
at com.gettag.client.GetTagGinjectorImpl.create_Key$type$com$gettag
$client$GetTagClientModule$WebStorageProvider$_annotation$$none$$
(GetTagGinjectorImpl.java:257)
at com.gettag.client.GetTagGinjectorImpl.get_Key$type$com$gettag
$client$GetTagClientModule$WebStorageProvider$_annotation$$none$$
(GetTagGinjectorImpl.java:271)
at com.gettag.client.GetTagGinjectorImpl.create_Key$type$com$gettag
$client$resources$WebStorage$_annotation$$none$$
(GetTagGinjectorImpl.java:44)
at com.gettag.client.GetTagGinjectorImpl.get_Key$type$com$gettag
$client$resources$WebStorage$_annotation$$none$$
(GetTagGinjectorImpl.java:56)
at
com.gettag.client.GetTagGinjectorImpl.getWebStorage(GetTagGinjectorImpl.java:
35)
at
com.gettag.client.presenter.LoginPresenter.onStart(LoginPresenter.java:
42)
at com.mvp4g.client.Mvp4gModuleImpl$3.start(Mvp4gModuleImpl.java:
130)
at
com.mvp4g.client.Mvp4gModuleImpl.createAndStartModule(Mvp4gModuleImpl.java:
163)
at
com.gettag.client.GetTagEntryPoint.onModuleLoad(GetTagEntryPoint.java:
38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.google.gwt.dev.shell.ModuleSpace.onLoad(ModuleSpace.java:
396)
at
com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:
183)
at
com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:
510)
at
com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:
352)
at java.lang.Thread.run(Unknown Source)

Any kind help on this will be highly appreciated.

Many thanks & best regards
Andy

Thomas Broyer

unread,
Apr 26, 2011, 12:19:59 PM4/26/11
to google-we...@googlegroups.com


On Tuesday, April 26, 2011 5:42:11 PM UTC+2, Andy wrote:
Hi,

I am trying to serialize and deserialize to and from json using
AutoBean as per the link
http://code.google.com/p/google-web-toolkit/wiki/AutoBean

I have the following classes
---------------------------------------------------------------------------------------------
@ProxyFor(User.class)
public interface UserProxy extends EntityProxy {


I'm not sure but I think you should use ProxySerializer if your AutoBeans are RequestFactory proxies. You'll obtain such a ProxySerializer with the getSerializer method of RequestFactory.

Andy

unread,
Apr 27, 2011, 8:54:57 AM4/27/11
to Google Web Toolkit
Many thanks Thomas for your advice, I am able to get it done!
Really appreciate for your help :D
Kind Regards
Andy

-sowdri-

unread,
Aug 28, 2011, 1:00:50 PM8/28/11
to google-we...@googlegroups.com

To create a self-contained message that encapsulates a proxy:

 RequestFactory myFactory = ...;
 MyFooProxy someProxy = ...;
 
 DefaultProxyStore store = new DefaultProxyStore();
 ProxySerializer ser = myFactory.getSerializer(store);
 // More than one proxy could be serialized
 String key = ser.serialize(someProxy);
 // Create the flattened representation
 String payload = store.encode();
 
To recreate the object:
 ProxyStore store = new DefaultProxyStore(payload);
 ProxySerializer ser = myFactory.getSerializer(store);
 MyFooProxy someProxy = ser.deserialize(MyFooProxy.class, key);

I'm using html5 client-side storage, so I've to serialize EntityProxies. In that case, should we store the key seperately. Or am I missing something??

Thanks,
Reply all
Reply to author
Forward
0 new messages