So basically I get a stackoverflow with these two exceptions. I have to stop/kill the server to stop them.
I think the problem is in ValueProxyCategory
. It calls the function hashCode() and this calls AutoBeanUtils.getAllProperties(bean).hashCode();
This retrieves all properties as a Map and then calculates the hashcode for each element. However because I have a cyclic dependency between Term
and Term2Term
it will go into an infinite loop.
Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedMethodAccessor88.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.google.web.bindery.autobean.vm.impl.BeanMethod$5.invoke(BeanMethod.java:155) at com.google.web.bindery.autobean.vm.impl.BeanMethod$1.invoke(BeanMethod.java:44) at com.google.web.bindery.autobean.vm.impl.SimpleBeanHandler.invoke(SimpleBeanHandler.java:43) at com.google.web.bindery.autobean.vm.impl.ShimHandler.hashCode(ShimHandler.java:66) at sun.reflect.GeneratedMethodAccessor77.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.google.web.bindery.autobean.vm.impl.ShimHandler.invoke(ShimHandler.java:76) at java.util.HashMap$Entry.hashCode(HashMap.java:818) at java.util.AbstractMap.hashCode(AbstractMap.java:494) at com.google.web.bindery.requestfactory.shared.impl.ValueProxyCategory.hashCode(ValueProxyCategory.java:55)
Is there a "Caused by" for this UndeclaredThrowableException?To view this discussion on the web visit https://groups.google.com/d/msg/google-web-toolkit/-/aH5oLo02k7kJ.
On Wednesday, November 28, 2012 10:41:34 AM UTC+1, Ümit Seren wrote:--I am not sure if this is a known issue. But I recently tried to map some
JPA2 Entities
toValueProxy's
and run into a weird issue.In the database I have a table (Term) which references itself using an intermediate/mapping table (basically building a graph like structure).
Term ---> Term2Term.parent
Term <--- Term2Term.childBasically a record from table A can have n childrin and exactly one parent (DAG).
The
ValueProxy's
look like this:@ProxyForName(value="xxxxx") public interface TermProxy extends ValueProxy { public Integer getId(); ...... public Set<Term2TermProxy> getParents(); public Set<Term2TermProxy> getChilds(); }
@ProxyForName(value="xxxx") public interface Term2TermProxy extends ValueProxy { public Integer getId(); public TermProxy getParent(); public TermProxy getChild(); }
Furthermore I have an
EntityProxy
in which one Term is embedded:@ProxyForName(xxx) public interface SomeEntityProxy extends EntityProxy{ TermProxy getTraitOntologyTerm(); }
When I load the
SomeEntityProxy
object and also load theTermProxy
I run into an infinite loop on the backend/server when serializing the payload with following exception:java.lang.reflect.UndeclaredThrowableException at $Proxy118.hashCode(Unknown Source) at com.google.web.bindery.autobean.vm.impl.ShimHandler.hashCode(ShimHandler.java:66) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.google.web.bindery.autobean.vm.impl.ShimHandler.invoke(ShimHandler.java:76) at $Proxy118.hashCode(Unknown Source) at java.util.HashMap.hash(HashMap.java:351) at java.util.HashMap.put(HashMap.java:471) at java.util.HashSet.add(HashSet.java:217) at com.google.web.bindery.requestfactory.server.Resolver.resolveClientValue(Resolver.java:637) at com.google.web.bindery.requestfactory.server.Resolver.access$400(Resolver.java:51) at com.google.web.bindery.requestfactory.server.Resolver$PropertyResolver.visitReferenceProperty(Resolver.java:140) at com.google.web.bindery.autobean.shared.AutoBeanVisitor.visitCollectionProperty(AutoBeanVisitor.java:229) at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.traverseProperties(ProxyAutoBean.java:300) at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.traverse(AbstractAutoBean.java:166) at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.accept(AbstractAutoBean.java:101) at com.google.web.bindery.requestfactory.server.Resolver.resolveClientValue(Resolver.java:414)
I suspect that this is due to the fact that
ValueProxy's
don't have an identity and on the backend it traverse through all properties of my entity. However by having a reference fromTerm2Term
back to Term I can end up with a cyclic dependency.i.e. Term A -> Term2Term.parent -> Term B -> Term2Term.child -> Term A
If I break one of the relationships (parent or child) from Term to Term2Term it serializes fine. However when I adda nother ValueProxy (Term A -> SomeValueProxy -> Term A ) that contains a property which maps back to the Term, I again get a stackoverflow however this time on the client.
I guess switching to
EntityProxy
would solve the problem as the properties don't automatically get serialized and for identity thestableId
is used.
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
No comments:
Post a Comment