当我使用Jackson ObjectMapper()类的writeValueAsString()方法时,如何解决这种无限递归(StackoverflowError)?

时间:2015-09-18 08:55:44

标签: json spring jackson

我绝对是JSON的新手,以及Java处理如何转换为这种格式。

所以我在Spring MVC应用程序中遇到以下问题我有这个控制器方法正确处理对 /provinceDiUnaRegione.json 资源的AJAX请求:

@RequestMapping(value = "/provinceDiUnaRegione.json")
@ResponseBody
public String getProvince(String codiceRegione) {

    System.out.println("INTO getProvince()");

    List<Twb1013Provincia> provinceDiUnaRegioneList =  geograficaService.getListaProvinceDiUnaRegione(codiceRegione);

    try {
        String listaProvince = new ObjectMapper().writeValueAsString(provinceDiUnaRegioneList);
        return listaProvince;
    } catch (JsonProcessingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

    return "";

}

正如您所见,此方法检索 Twb1013Provincia 对象的列表,然后使用此行将检索到的列表转换为JSON字符串(如果错误则更正我)

String listaProvince = new ObjectMapper().writeValueAsString(provinceDiUnaRegioneList);

问题在于,当执行此行时,我获得了此异常:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafiche.Twb1012Regione["tpg1029Provnuoists"]->org.hibernate.collection.internal.PersistentBag[0]->it.myCompany.myProject.anagrafiche.Tpg1029Provnuoist["twb1012Regione"]->it.myCompany.myProject.anagrafic...

所以做一些分析在我看来问题是我试图转换 Twb1013Provincia 对象列表,如下所示:

@Entity
@Table(name="anagrafiche.TWB1013_PROVINCIA")
@NamedQuery(name="Twb1013Provincia.findAll", query="SELECT t FROM Twb1013Provincia t")
public class Twb1013Provincia implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="COD_PRV")
    private String codPrv;

    //bi-directional many-to-one association to Twb1012Regione
    @ManyToOne
    @JoinColumn(name="COD_REG")
    private Twb1012Regione twb1012Regione;

    .................................................
    .................................................
    OTHER FIELDS
    .................................................
    .................................................
}

问题看来,正如您所看到的,此类包含 Twb1012Regione twb1012Regione; 字段,并且此 Twb1012Regione 类依次包含对原始 Twb1013Provincia (要转换的对象),如下所示:

@Entity
@Table(name="anagrafiche.TWB1012_REGIONE")
@NamedQuery(name="Twb1012Regione.findAll", query="SELECT t FROM Twb1012Regione t")
public class Twb1012Regione implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="COD_REG")
    private String codReg;

    //bi-directional many-to-one association to Twb1013Provincia
    @OneToMany(mappedBy="twb1012Regione")
    private List<Twb1013Provincia> twb1013Provincias;

    .................................................
    .................................................
    OTHER FIELDS
    .................................................
    .................................................
}

所以问题似乎是当我尝试转换 Twb1013Provincia 对象时,它会在其中找到 Twb1012Regione 字段,其中包含 Twb1013Provincia ...所以进入一个无限循环,转换是不可能的。

那我怎么解决这个问题呢?是否存在从 Twb1013Provincia 对象转换中排除 Twb1012Regione 字段的方法?

或者我可以更好地指定必须以JSON格式转换的 Twb1013Provincia 类字段的列表吗? (我只需转换此类的2个字段)

TNX

1 个答案:

答案 0 :(得分:10)

您可以使用@JsonIgnore注释从序列化中排除字段。

尝试:

@JsonIgnore
private Twb1012Regione twb1012Regione;