I am not sure if this is a known issue. But I recently tried to map some JPA2 Entities
to ValueProxy'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.child
Basically 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 the TermProxy
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 from Term2Term
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 the stableId
is used.
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-web-toolkit/-/-nbC2sCdmFsJ.
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