1.禁止使用lombok 的@Data 註釋java
使用@Data註釋後,默認會重寫父類的toString()方法,hashcode()等方法,在往map裏存的時候,會根據equals和hashcode方法,來計算下標,而若是@Data註釋的類與其餘類有關聯的屬性(如:@onetoone,@onetomany等)且關聯的屬性不爲空時,會不斷從關聯方的屬性進行查找,再從關聯方查找該@Data註釋的類,依次循環,形成堆棧溢出。json
例子:考試信息與報名信息以 1:n 進行關聯app
package com.apply.entity; import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerator; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.persistence.*; import java.util.Date; /** * @author tianp * 報名信息 apply_info */ @Data @Entity @Table(name = "apply_info") @ApiModel(value = "ApplyInfo", description = "報名信息對象") @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class ApplyInfo { @Id @GeneratedValue @ApiModelProperty(value = "id", dataType = "long") private Long id; @ManyToOne @JoinColumn(name = "examNum") private ExamInfo examInfo; }
package com.apply.entity; import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.ObjectIdGenerators; import lombok.Data; import javax.persistence.*; import java.util.Date; import java.util.Set; /** * @author tianp * 考試信息設置 apply_examinfo */ @Data @Entity @Table(name = "apply_examinfo") @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class ExamInfo { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "examInfo", cascade = CascadeType.ALL) private Set<ApplyInfo> applyInfos; }
public class Test1 { @Test public void testObject() { ExamInfo examInfo = new ExamInfo(); ApplyInfo applyInfo = new ApplyInfo(); Set<ApplyInfo> set = new HashSet<>(); set.add(applyInfo); examInfo.setApplyInfos(set); applyInfo.setExamInfo(examInfo); System.out.println(examInfo.toString()); System.out.println(applyInfo.toString()); } }
java.lang.StackOverflowError at java.lang.StringBuilder.append(StringBuilder.java:136) at com.apply.entity.ExamInfo.toString(ExamInfo.java:16) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at com.apply.entity.ApplyInfo.toString(ApplyInfo.java:17) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at java.util.AbstractCollection.toString(AbstractCollection.java:462) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at com.apply.entity.ExamInfo.toString(ExamInfo.java:16) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at com.apply.entity.ApplyInfo.toString(ApplyInfo.java:17) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at java.util.AbstractCollection.toString(AbstractCollection.java:462) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:131) at com.apply.entity.ExamInfo.toString(ExamInfo.java:16)
。。。。。。
2.關聯屬性使一方的屬性在json轉換時生效ui
使用SpringMVC 默認的jackson 進行json轉換時,存在關聯屬性,使用@JsonIgnore忽略屬性(在one的一方進行忽略,)spa