我试图找出这个错误,因为5个小时没有任何成功。所以我终于想到在这里发帖了。请帮助我真的遇到大麻烦。我坚持这个,看不到解决这个错误的方法。这是我的数据库结构
tblBlogRegion
BlogRegionId (primary key)
BlogRegionName
tblGadget
GadgetId(primary key)
GadgetName
tblBlogs
BlogId(primary key)
Blogname
BlogTypeId (reference key from tblSiteTerm
tblSiteTerms
SiteTermsId(primary key)
SiteTermsName
tblBlogGadgets
BlogGadgetsId(primary key)
BlogRegionId(foreign key from tblBlogRegion)
BlogId(foreign key from tblBlog)
GadgetId(foreign key from tblGadget)
这不是正常的数据库结构吗?你看到任何循环的东西吗?当我尝试从tblGadgets获取列表时,我收到此错误: -
[com.sun.istack.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: entity.BlogGadgets[blogGadgetsId=1] -> entity.Blogs[blogId=2] -> entity.BlogGadgets[blogGadgetsId=1]]
我正在尝试使用JAS-WS从Web服务获取列表。
答案 0 :(得分:4)
我想您正在使用一些ORM从数据库中获取数据,然后将其序列化并通过Web服务发送。
因此,当您获取其中包含BlogGadgets
Blogs
的{{1}}列表时,相同的Blogs
列出了相同的BlogGadgets
等等...
这就是调用循环引用,将它们放在对象模型中很常见,但是当你想要在线上发送它时,你需要确保你拥有的对象图是一棵树,至少对于你正在使用的序列化器。
对此的一个解决方案是将您正在使用的域对象/实体转换/映射到具有适当树结构的数据传输对象:(在c#中但在java中应该非常相似)
[Serializable]
public class BlogGadgetDto
{
public int GadgetId {get;set;}
public BlogSmallDto Blog {get;set;}
// and so on
}
[Serializable]
public class BlogSmallDto
{
public int BlogId {get;set;}
public string BlogName {get;set;}
// and so on
}
请注意,现在BlogGadgetDto
引用BlogSmallDto
但不是相反。
答案 1 :(得分:-1)
解决方案只是添加注释:
import javax.xml.bind.annotation.XmlTransient;
@XmlTransient
在导致循环的财产的吸气剂。