我正在javaEE6中开发我的第一个RestFul webServices。 这是我的实体Bean
@XmlRootElement
@Entity
public class MyEntity implements Serializable {
@Id
@GeneratedValue
private long idEntity;
private String name;
private String description;
@OneToMany(mappedBy = "entity" , fetch = FetchType.EAGER)
private List<EntityB> list;
//Get and set
}
@Entity
public class EntityB {
@Id
@GeneratedValue
private long idCategoria;
@ManyToOne
private MyEntity myEntity;
}
这是我的webServices
@Path("myentity")
@Produces( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Consumes( {MediaType.APPLICATION_XML , MediaType.APPLICATION_JSON })
@Stateless
public class MyEntityService {
@Inject
MyEntityDao entityDao;
@GET
@Path("{id}/")
public MyEntity findById(@PathParam("id") Long id){
return entityDao.findById(id);
}
}
最后我配置了Jersey
@ApplicationPath("ws")
public class ApplicationConfig extends Application {
}
现在,如果我尝试调用我的Web服务(localhost:8080 / xxxx / ws / myentity),我会收到此错误:
HTTP状态500 - javax.xml.bind.MarshalException - 包含链接异常:[com.sun.istack.SAXException2:在对象图中检测到循环。这将导致无限深的XML
答案 0 :(得分:2)
你有一个循环的对象图,这是不允许的,因为它会产生一个“无限的”XML。
MyEntity持有对EntityB的引用,EntityB包含一个可以追溯到MyEntity的引用。
编组将试图编组MyEntity&gt;实体B&gt; MyEntity&gt; EntityB等等。
您可以将EntityB中的MyEntity标记为@XmlTransient,以避免这种情况。
但是,尝试在所有项目中使用相同的对象类(从持久层到通信层)可能不是一个好主意。