miércoles, 28 de agosto de 2013

Como solucionar el error javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML

Si intentas montar un servicio Web y empleas JAXB para hacer el serializado de objetos hacia XML y viceversa, puedes encontrar un error del tipo "A cycle is detected in the object graph" como indicamos en el título de la entrada.

Este error ocurre porque tienes una relacción en ambos sentidos entre dos clases. Es decir, supongamos que tienes una clase Persona y otra que se llama Equipo con una relación como sigue:


En Persona:
@OneToMany(fetch = FetchType.LAZY, mappedBy="plant")
 public List<Equipo> getEquipo() {
        return equipos;
 }

En Equipo:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PERSONA_ID")
public Persona getPersona() {
        return persona;
}

Es decir, en la clase Persona tenemos una lista con las Áreas que tiene relacionadas y desde cada Área podemos acceder a la Persona a la que pertenece. Esto hace que al serializar se entre en un bucle y nos muestre el error  "A cycle is detected in the object graph".

Para solucionarlo tenemos que usar la anotación @XMLTransient en cada uno de los métodos get de las relaciones que nos causan problema. Por lo tanto nuestras relaciones quedarán como mostramos a continuación:

En Persona:
@XmlTransient
@OneToMany(fetch = FetchType.LAZY, mappedBy="plant")
public List<Equipo> getEquipos() {
      return equipos;
}

En Equipo:
@XmlTransient
@ManyToOne(fetch = FetchType.LAZY)

@JoinColumn(name = "PERSONA_ID")
public Persona getPersona() {
        return persona;
}
Y se evita el error de entrar en un loop infinito. Espero que os sirva





1 comentario :