spring mvc解决同一对象转换JSON出现无限死循环问题

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/bojinyanfeng/article/details/87921445

异常如下所示:

at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:430)
	at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
	at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
	at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:430)
	at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
	at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
	at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:442)
	at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:383)
	at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:142)
	at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:430)
	at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
	at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
	at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:430)
	at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
	at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
	at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:442)
	at org.codehaus.jackson.map.ser.ContainerSerializers$CollectionSerializer.serializeContents(ContainerSerializers.java:383)
	at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:142)
	at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:430)
	at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
	at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
	at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:430)
	at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
	at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
...

异常只截一部分,根据百度到的结果,是因为实体里配置了一对多关系并且在转换成json时造成的。

实体类如下所示(还没修改的):

@Entity
@Table(name = "t_s_depart")
public class TSDepart extends IdEntity implements java.io.Serializable {
	private TSDepart TSPDepart;//上级部门
	
	private String departname;//部门名称

	...(省略一部分代码)
	
	private List<TSDepart> TSDeparts = new ArrayList<TSDepart>();//下属部门

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "parentdepartid")
	public TSDepart getTSPDepart() {
		return this.TSPDepart;
	}

	public void setTSPDepart(TSDepart TSPDepart) {
		this.TSPDepart = TSPDepart;
	}

	@Column(name = "departname", nullable = false, length = 100)
	public String getDepartname() {
		return this.departname;
	}

	public void setDepartname(String departname) {
		this.departname = departname;
	}
        
        ...(省略一部分代码)

        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSPDepart")
	public List<TSDepart> getTSDeparts() {
		return TSDeparts;
	}

	public void setTSDeparts(List<TSDepart> tSDeparts) {
		TSDeparts = tSDeparts;
	}
}

解决方法如下:

方法一:实体类上加注释@JsonIgnoreProperties

参考:https://www.xuebuyuan.com/1025974.html

@Entity
@Table(name = "t_s_depart")
@JsonIgnoreProperties(value={"TSDeparts"})
public class TSDepart extends IdEntity implements java.io.Serializable {
    ....(代码省略)
}

根据上述的方法修改,还是有这个异常,因为时间问题,这里暂时不管了。

方法二:在一对多中多的一方get方法上加上注解@JsonBackReference

参考:https://zzc1684.iteye.com/blog/2186502

         ...(省略一部分代码)
        @JsonBackReference
        @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TSPDepart")
	public List<TSDepart> getTSDeparts() {
		return TSDeparts;
	}

	public void setTSDeparts(List<TSDepart> tSDeparts) {
		TSDeparts = tSDeparts;
	}
}

根据上述方法可以解决该异常。至于在set方法上加注解没试过。

方法三:在一对多中一的get方法上加上注解@JsonIgnore

参考:https://my.oschina.net/u/943437/blog/145246

	...(忽略一部分代码)
        @ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "parentdepartid")
	@JsonIgnore
	public TSDepart getTSPDepart() {
		return this.TSPDepart;
	}

	public void setTSPDepart(TSDepart TSPDepart) {
		this.TSPDepart = TSPDepart;
	}
        ...(忽略一部分代码)

根据上述方法可以解决该异常。

温馨提示:如果上述方法都解决不了,请检查一下导入的jar包版本(我的是1.8.4版本的)或者是否import正确

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonBackReference;
import org.codehaus.jackson.annotate.JsonIgnore;

猜你喜欢

转载自blog.csdn.net/bojinyanfeng/article/details/87921445