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

异常如下所示:

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;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值