Java ';直接自参考导致循环';杰克逊与遗产
我有一个类似这样的课程:Java ';直接自参考导致循环';杰克逊与遗产,java,jpa,inheritance,jackson,jaxb,Java,Jpa,Inheritance,Jackson,Jaxb,我有一个类似这样的课程: @Entity @Inheritance(strategy = InheritanceType.JOINED) @Audited @DiscriminatorColumn(name = "tipo_hito") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(propOrder = { "idHito" }) @XmlRootElement(name = "Hito") public abstract class Hito
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Audited
@DiscriminatorColumn(name = "tipo_hito")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "idHito" })
@XmlRootElement(name = "Hito")
public abstract class Hito implements Ordenable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "idhito", nullable = false)
private Long idHito;
public Long getIdHito() { return idHito; }
public void setIdHito(Long idHito) { this.idHito = idHito; }
}
以及一个扩展上述类的类
@MappedSuperclass
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = {..., "successors", "predecessors", ...})
@XmlRootElement(name = "HitoOrdenable")
public abstract class HitoOrdenable extends Hito {
@XmlElement(name = "predecessors")
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "succession", joinColumns = { @JoinColumn(name = "idpredecessor") }, inverseJoinColumns = { @JoinColumn(name = "idsuccessor") })
private Set<Hito> predecessors;
@XmlElement(name = "successors")
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "succession", joinColumns = { @JoinColumn(name = "idsuccessor") }, inverseJoinColumns = { @JoinColumn(name = "idpredecessor") })
private Set<Hito> successors;
// More code...
}
因此,当我得到Hito1时,这有后续的Hito2和Hito3。但是当我得到Hito2时,它有一个前身Hito1。因此,开始一个“无限循环”
确切的错误是:
com.fasterxml.jackson.databind.JsonMappingException:Direct
导致循环的自参考(通过参考链:
ar.gob.buenosaires.esb.domain.message.ProyectoRespMsg[“proyectos”]->java.util.ArrayList[5]->ar.gob.buenosaires.domain.Proyecto[“obras”]->org.hibernate.collection.internal.PersistentBag[0]->ar.gob.buenosaires.domain.hitobra[“hitos”]->
我试着在
前辈中设置@JsonIgnore,但没有成功。经过几天的尝试。我们找到的唯一解决方案是添加@JsonIgnoreProperties({“preventors”})
和@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class,property=“idhitoauax”)
HitoOrdenable.java
@MappedSuperclass
@XmlType(propOrder = {..., "successors", "predecessors", ...})
@XmlAccessorType(XmlAccessType.FIELD)
@JsonIgnoreProperties({ "predecessors" })
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="idHitoAux")
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Audited
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "idHito", "tipoHito"})
@JsonIgnoreProperties({"idHitoAux", "hibernateLazyInitializer", "handler"})
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, visible = true, property = "tipoHito")
@JsonSubTypes({
@JsonSubTypes.Type(name = "hito_obra", value = HitoObra.class),
@JsonSubTypes.Type(name = "hito_proyecto", value = HitoProyecto.class)
})<
Hito.java
@MappedSuperclass
@XmlType(propOrder = {..., "successors", "predecessors", ...})
@XmlAccessorType(XmlAccessType.FIELD)
@JsonIgnoreProperties({ "predecessors" })
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="idHitoAux")
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Audited
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "idHito", "tipoHito"})
@JsonIgnoreProperties({"idHitoAux", "hibernateLazyInitializer", "handler"})
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, visible = true, property = "tipoHito")
@JsonSubTypes({
@JsonSubTypes.Type(name = "hito_obra", value = HitoObra.class),
@JsonSubTypes.Type(name = "hito_proyecto", value = HitoProyecto.class)
})<
@实体
@继承(策略=InheritanceType.JOINED)
@审计
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(proporter={“idHito”,“tipoHito”})
@JsonIgnoreProperties({“idHitoAux”、“hibernateLazyInitializer”、“handler”})
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.EXISTING_属性,visible=true,PROPERTY=“tipoHito”)
@JsonSubTypes({
@JsonSubTypes.Type(name=“hito_obra”,value=HitoObra.class),
@JsonSubTypes.Type(name=“hito_proyecto”,value=HitoProyecto.class)
})<
使用JsonIgnoreProperties,我们可以防止成功者和前辈之间的无限循环,使用@JsonIdentityInfo
这是因为如果我们使用“idHito”
而不是“idHitoAux”
(它等于idHito),Hibernate会将idHito转换为null。因此,使用“idHitoAux”
Hibernate可以识别列表中的每个对象
PD:在那个解决方案之后,我们遇到了反序列化抽象类Hito
的问题,所以我们的解决方案是添加@JsonSubTypes
你好