views:

138

answers:

1

Hello, I am trying to figure out this error since 5 hours without any success. SO i finally thought of posting in here. Please help i am really in big trouble. I am stuck on this and see no way of solving this error. This is my database structure

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)

Is it not normal database structure? Do you see anything that is cyclic? WHen i try to fetch list from tblGadgets i get this error :-

[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]]

I am trying to get list from web service using JAS-WS.

+1  A: 

I suppose you are using some ORM to fetch data from database and then serialize it and send via web service. So when you fetch list of BlogGadgets they have Blogs in it, but the same Blogs have a list of the same BlogGadgets and so on...

Thats called circular reference and its very common to have them at your object model but when you want to send it on wire you need to make sure that object graph you have is a tree, at least for serializer you are using.

One solution to this would be to transform/map domain objects/entities you are using to Data Transfer Objects which will have proper tree structure like: (in c# but it should be pretty same in 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
}

Note that now BlogGadgetDto are referencing BlogSmallDto but not the other way around.

miensol
Great job! i wish i could give you 10 votes for it. I have solved my problem. I marked in bloggadget which had collection of blogs as @XmlTransient and it worked like a charm. Have to do this for rest of my entities. Thanks miensol!
Ankit Rathod