Json Rest-JPA:异常描述:在对象图中检测到一个循环
我相信大家, 我使用JPA创建了一个RestFul服务来访问我的数据库。我用于检测错误et tomcat日志给我:Json Rest-JPA:异常描述:在对象图中检测到一个循环,json,rest,eclipselink,moxy,Json,Rest,Eclipselink,Moxy,我相信大家, 我使用JPA创建了一个RestFul服务来访问我的数据库。我用于检测错误et tomcat日志给我: javax.ws.rs.WebApplicationException: HTTP 500 Internal Server Error at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:865) at org.glassfish.jersey.messa
javax.ws.rs.WebApplicationException: HTTP 500 Internal Server Error
at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:865)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:243)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:230)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:149)
at org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:103)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:149)
at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:88)
at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:149)
at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1139)
at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:574)
at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:381)
at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:371)
at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:262)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:318)
at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:236)
at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1010)
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:382)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:345)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:220)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.xml.bind.MarshalException
- with linked exception:
[Exception [EclipseLink-25037] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A cycle is detected in the object graph. This will cause an infinite loop: EJPlanning.Models.Planning@320a92e7 -> EJPlanning.Models.Groupe@d62730a -> EJPlanning.Models.Planning@320a92e7]
at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:457)
at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:863)
... 46 more
Caused by: Exception [EclipseLink-25037] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: A cycle is detected in the object graph. This will cause an infinite loop: EJPlanning.Models.Planning@320a92e7 -> EJPlanning.Models.Groupe@d62730a -> EJPlanning.Models.Planning@320a92e7
at org.eclipse.persistence.exceptions.XMLMarshalException.objectCycleDetected(XMLMarshalException.java:401)
at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:209)
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118)
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1)
at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.marshalSingleValue(XMLCompositeCollectionMappingNodeValue.java:334)
at org.eclipse.persistence.internal.oxm.XMLCompositeCollectionMappingNodeValue.marshal(XMLCompositeCollectionMappingNodeValue.java:104)
at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:149)
at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:102)
at org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext.marshal(ObjectMarshalContext.java:59)
at org.eclipse.persistence.internal.oxm.XPathNode.marshal(XPathNode.java:401)
at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:240)
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118)
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1)
at org.eclipse.persistence.internal.oxm.XMLCompositeObjectMappingNodeValue.marshalSingleValue(XMLCompositeObjectMappingNodeValue.java:260)
at org.eclipse.persistence.internal.oxm.XMLCompositeObjectMappingNodeValue.marshal(XMLCompositeObjectMappingNodeValue.java:151)
at org.eclipse.persistence.internal.oxm.NodeValue.marshal(NodeValue.java:102)
at org.eclipse.persistence.internal.oxm.record.ObjectMarshalContext.marshal(ObjectMarshalContext.java:59)
at org.eclipse.persistence.internal.oxm.XPathNode.marshal(XPathNode.java:401)
at org.eclipse.persistence.internal.oxm.XPathObjectBuilder.buildRow(XPathObjectBuilder.java:240)
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:118)
at org.eclipse.persistence.internal.oxm.TreeObjectBuilder.buildRow(TreeObjectBuilder.java:1)
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:751)
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:571)
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshalStreamOrWriter(XMLMarshaller.java:1107)
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:919)
at org.eclipse.persistence.internal.oxm.XMLMarshaller.marshal(XMLMarshaller.java:862)
at org.eclipse.persistence.jaxb.JAXBMarshaller.marshal(JAXBMarshaller.java:455)
... 47 more
经过多次搜索,我没有找到可能的解决方案。因此,我希望您能帮助我:
public class GroupeMapper extends AbstractFacade implements IGroupeMapper{
@PersistenceContext(unitName = "EJPlanningRestPU")
private EntityManager em;
private List<Groupe> list;
public GroupeMapper() {
super(Groupe.class);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJPlanningRestPU");
em = emf.createEntityManager(); }
@Override
protected EntityManager getEntityManager() {
return em;
}
public void getAll() {
super.findAll();
}
public class PlanningMapper extends AbstractFacade implements IPlanningMapper{
@PersistenceContext(unitName = "EJPlanningRestPU")
private EntityManager em;
private List<Planning> list;
public PlanningMapper() {
super(Planning.class);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJPlanningRestPU");
em = emf.createEntityManager(); }
@Override
protected EntityManager getEntityManager() {
return em;
}
public void getAll() {
super.findAll();
}
群组:
@Entity
@XmlRootElement
public class Groupe implements Serializable{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "GROUPE_ID")
private int Id;
private String Nom;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "Groupe")
@JoinColumn(name="PLANNING_ID")
private Collection<Planning> Plannings;
@ManyToMany
@JoinTable(name="GroupeActivite",
joinColumns=@JoinColumn(name="GROUPE_ID", referencedColumnName="GROUPE_ID"),
inverseJoinColumns=@JoinColumn(name="ACTIVITE_ID", referencedColumnName="ACTIVITE_ID"))
private Collection<Activite> Activites;
public Groupe() {
}
public Groupe(String Nom, Collection<Planning> Plannings, Collection<Activite> Activites) {
this.Nom = Nom;
this.Plannings = Plannings;
this.Activites = Activites;
}
public int getId() {
return Id;
}
public void setId(int Id) {
this.Id = Id;
}
public String getNom() {
return Nom;
}
public void setNom(String Nom) {
this.Nom = Nom;
}
public Collection<Planning> getPlannings() {
return Plannings;
}
public void setPlannings(Collection<Planning> Plannings) {
this.Plannings = Plannings;
}
public Collection<Activite> getActivites() {
return Activites;
}
public void setActivites(Collection<Activite> Activites) {
this.Activites = Activites;
}
@实体
@XmlRootElement
公共类Groupe实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“GROUPE\u ID”)
私有int-Id;
私有字符串名称;
@OneToMany(cascade=CascadeType.ALL,mappedBy=“Groupe”)
@JoinColumn(name=“PLANNING\u ID”)
私人收藏计划;
@许多
@JoinTable(name=“GroupeActivite”,
joinColumns=@JoinColumn(name=“GROUPE\u ID”,referencedColumnName=“GROUPE\u ID”),
inverseJoinColumns=@JoinColumn(name=“ACTIVITE\u ID”,referencedColumnName=“ACTIVITE\u ID”))
私人收藏活动;
公共组(){
}
公共组(字符串名称、收集计划、收集活动){
这个.Nom=Nom;
这个。规划=规划;
this.Activites=Activites;
}
公共int getId(){
返回Id;
}
公共无效集合Id(内部Id){
这个.Id=Id;
}
公共字符串getNom(){
返回名称;
}
公共无效集合名(字符串名){
这个.Nom=Nom;
}
公共收集计划{
回归规划;
}
公共空间设置规划(收集规划){
这个。规划=规划;
}
公共集合getActivites(){
返回活动;
}
公共无效集合活动(集合活动){
this.Activites=Activites;
}
规划:
@Entity
@XmlRootElement
public class Planning implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "PLANNING_ID")
private int Id;
@Column(name="DATE_EVENEMENT")
@Temporal(TemporalType.TIMESTAMP)
private Date dateEvenement;
private EnumTypePlanning Type;
@ManyToMany
@JoinTable(name="ActivitePlanning",
joinColumns=@JoinColumn(name="PLANNING_ID", referencedColumnName="PLANNING_ID"),
inverseJoinColumns=@JoinColumn(name="ACTIVITE_ID", referencedColumnName="ACTIVITE_ID"))
private Collection<Activite> Activites;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="GROUPE_ID", insertable = false, updatable = false)
private Groupe Groupe;
@ManyToMany
@JoinTable(name="UtilisateurPlanning",
joinColumns=@JoinColumn(name="PLANNING_ID", referencedColumnName="PLANNING_ID"),
inverseJoinColumns=@JoinColumn(name="UTILISATEUR_ID", referencedColumnName="UTILISATEUR_ID"))
private Collection<Utilisateur> Moniteurs;
public Planning(){
}
public Planning(Date dateEvenement, EnumTypePlanning Type, Collection<Activite> Activite, Groupe Groupe){
this.dateEvenement = dateEvenement;
this.Type=Type;
this.Activites=Activite;
this.Groupe=Groupe;
}
public int getId() {
return Id;
}
public void setId(int Id) {
this.Id = Id;
}
public Date getDateEvenement() {
return dateEvenement;
}
public void setDateEvenement(Date dateEvenement) {
this.dateEvenement = dateEvenement;
}
public EnumTypePlanning getType() {
return Type;
}
public void setType(EnumTypePlanning Type) {
this.Type = Type;
}
public Collection<Activite> getActivites() {
return Activites;
}
public void setActivites(Collection<Activite> Activites) {
this.Activites = Activites;
}
public Groupe getGroupe() {
return Groupe;
}
public void setGroupe(Groupe Groupe) {
this.Groupe = Groupe;
}
public Collection<Utilisateur> getMoniteurs() {
return Moniteurs;
}
public void setMoniteurs(Collection<Utilisateur> Moniteurs) {
this.Moniteurs = Moniteurs;
}
@实体
@XmlRootElement
公共类规划实现了可序列化{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“PLANNING\u ID”)
私有int-Id;
@列(name=“DATE\u evement”)
@时态(TemporalType.TIMESTAMP)
私人约会;
私人计划型;
@许多
@JoinTable(name=“ActivitePlanning”,
joinColumns=@JoinColumn(name=“PLANNING\u ID”,referencedColumnName=“PLANNING\u ID”),
inverseJoinColumns=@JoinColumn(name=“ACTIVITE\u ID”,referencedColumnName=“ACTIVITE\u ID”))
私人收藏活动;
@多通(级联=级联类型.ALL)
@JoinColumn(name=“GROUPE\u ID”,insertable=false,updateable=false)
私人集团;
@许多
@JoinTable(name=“UsilisaturPlanning”,
joinColumns=@JoinColumn(name=“PLANNING\u ID”,referencedColumnName=“PLANNING\u ID”),
inverseJoinColumns=@JoinColumn(name=“usiliateur\u ID”,referencedColumnName=“usiliateur\u ID”))
私人收藏监督员;
公共规划(){
}
公共计划(日期-日期-活动、枚举类型计划类型、收集活动、分组){
this.DateEvenment=DateEvenment;
this.Type=Type;
this.Activites=Activite;
this.Groupe=Groupe;
}
公共int getId(){
返回Id;
}
公共无效集合Id(内部Id){
这个.Id=Id;
}
公共日期getDateEvenment(){
返回日期晚上;
}
公共作废设置日期晚上(日期晚上){
this.DateEvenment=DateEvenment;
}
公共枚举类型规划getType(){
返回类型;
}
公共void集合类型(EnumTypePlanning类型){
this.Type=Type;
}
公共集合getActivites(){
返回活动;
}
公共无效集合活动(集合活动){
this.Activites=Activites;
}
公共组getGroupe(){
返回组;
}
公共void setGroupe(Groupe-Groupe){
this.Groupe=Groupe;
}
公共集合getMoniteurs(){
返回监视器;
}
公共无效集合监视器(集合监视器){
这个.Moniteurs=Moniteurs;
}
GroupeMapper:
public class GroupeMapper extends AbstractFacade implements IGroupeMapper{
@PersistenceContext(unitName = "EJPlanningRestPU")
private EntityManager em;
private List<Groupe> list;
public GroupeMapper() {
super(Groupe.class);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJPlanningRestPU");
em = emf.createEntityManager(); }
@Override
protected EntityManager getEntityManager() {
return em;
}
public void getAll() {
super.findAll();
}
public class PlanningMapper extends AbstractFacade implements IPlanningMapper{
@PersistenceContext(unitName = "EJPlanningRestPU")
private EntityManager em;
private List<Planning> list;
public PlanningMapper() {
super(Planning.class);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJPlanningRestPU");
em = emf.createEntityManager(); }
@Override
protected EntityManager getEntityManager() {
return em;
}
public void getAll() {
super.findAll();
}
公共类GroupeMapper扩展了AbstractFacade,实现了IGroupeMapper{
@PersistenceContext(unitName=“EJPlanningRestPU”)
私人实体管理者;
私人名单;
公共组映射(){
超级(组级);
EntityManagerFactory emf=Persistence.createEntityManagerFactory(“EJPlanningRestPU”);
em=emf.createEntityManager();}
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
public void getAll(){
super.findAll();
}
规划制图器:
public class GroupeMapper extends AbstractFacade implements IGroupeMapper{
@PersistenceContext(unitName = "EJPlanningRestPU")
private EntityManager em;
private List<Groupe> list;
public GroupeMapper() {
super(Groupe.class);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJPlanningRestPU");
em = emf.createEntityManager(); }
@Override
protected EntityManager getEntityManager() {
return em;
}
public void getAll() {
super.findAll();
}
public class PlanningMapper extends AbstractFacade implements IPlanningMapper{
@PersistenceContext(unitName = "EJPlanningRestPU")
private EntityManager em;
private List<Planning> list;
public PlanningMapper() {
super(Planning.class);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("EJPlanningRestPU");
em = emf.createEntityManager(); }
@Override
protected EntityManager getEntityManager() {
return em;
}
public void getAll() {
super.findAll();
}
公共类PlanningMapper扩展AbstractFacade实现IPlanningMapper{
@PersistenceContext(unitName=“EJPlanningRestPU”)
私人实体管理者;
私人名单;
公共规划制图器(){
超级(规划类);
EntityManagerFactory emf=Persistence.createEntityManagerFactory(“EJPlanningRestPU”);
em=emf.createEntityManager();}
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
public void getAll(){
super.findAll();
}
我希望您能帮助我,我从一周开始就在搜索这个解决方案,找到解决方案对我来说非常重要。您有JPA注释告诉它如何处理进出数据库的循环,但没有XML注释告诉它如何处理从XML.S转换java模型时的循环关系具体来说,一个计划有一个团队,而团队有很多计划。看你是最好的Thaaaaank你!@Chris我如何处理多对多关系?