WebService调用一对多关联关系时出现 死循环:A cycle is detect
通过WebService调用一对多关联关系时引起的问题:A cycle is detected in the object graph 具体异常信息: org.apache.cxf.interceptor.Fault: Marshalling Error: A cycle is detected in the object graph. This will cause infinitely deep XML:?cn.jssms.platform.model.system.AppUser@75fce7?->cn.jssms.platform.model.system.AppRole@195266b?->?cn.jssms.platform.model.system.AppUser@75fce7 AppUser-->AppRole-->AppUser 在网上查阅资料后发现两个VO类中存在关联关系,可能是1:n 或n:1关系,应该跟Hibernate反射有关系。 循环引用: Parent 和 Child是1:n的关系,Parent含有一个child的列表children,child对于parent有一个引用,那这两个对象之间就存在循环引用的关系. 我们不能 直接将带有环的对象暴露给webservice,因为这会导致最终生成xml的时候会陷入死循环最后栈溢出,所以cxf检测出对象存在cycle会抛出一 个异常阻止进一步发布webservice.(以前的XFire可没这么聪明,它没有检测机制,直接就去序列化xml结果会导致 OutOfMemory). 如何解决呢?就是要破掉这个环,去某一端,如何在不破坏原有设计的情况下做到这一点,就是要使用@XmlTransient 虽然client能够拿到children列表了,但通过child得不到parent的信息,因为在client现在是单向的,那我也想访问parent怎么办? 怎么做到的?背后的道理是这样的: 这些功能必须要cxf来做客户端才能实现,但我们可以利用这种技术来在其他客户端实现这个功能.比如flex,.net,php 等等. one more thing上面的例子首先访问的是parent,cxf可以拿到两端的信息,但如果先访问child就拿不到parent了. 所以还是看具体设计,如果parent需要经常访问child,第一种最好,如果child要经常访问parent,显然是第二种 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |