在做项目的时候遇到一个错误java.lang.IllegalStateException: Cannot call sendError() after the response has been committed,这个错误在我的项目里是因为:项目中两个多对多关联的实体是双向关联导致了死循环。
public class Duty{
.......
@ManyToMany(cascade = CascadeType.REFRESH)
@ApiModelProperty(value = "系统",name = "infoSystemEntityList",hidden=true)
private List<InfoSystemEntity> infoSystemEntityList;
}
public class Infosystem{
......
@ManyToMany(cascade = CascadeType.REFRESH)
@ApiModelProperty(value = "职责",name = "dutyCatalogueEntityList",hidden=true)
private List<DutyCatalogueEntity> dutyCatalogueEntityList;
}
这种双向的关联导致了在序列化的时候会进入无限递归,一般用如下几种办法解决。
1. @JsonBackReference注解标在多对一或者多对多的属性上
@JsonBackReference
@ManyToMany(cascade = CascadeType.REFRESH)
@ApiModelProperty(value = "系统",name = "infoSystemEntityList",hidden=true)
private List<InfoSystemEntity> infoSystemEntityList;
@JsonBackReference:被它标注的属性在序列化时会被忽略
2. @JsonIgnore注解标在多对一或者多对多的属性上
@JsonIgnore
@ManyToMany(cascade = CascadeType.REFRESH)
@ApiModelProperty(value = "系统",name = "infoSystemEntityList",hidden=true)
private List<InfoSystemEntity> infoSystemEntityList;
@JsonIgnore:直接忽略掉这个属性,序列化和反序列化都会被忽略。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子)
3. @JsonIgnoreProperties注解
@JsonIgnoreProperties(value = {"infoSystemEntityList"})
public class Duty{
.......
@ManyToMany(cascade = CascadeType.REFRESH)
@ApiModelProperty(value = "系统",name = "infoSystemEntityList",hidden=true)
private List<InfoSystemEntity> infoSystemEntityList;
}
@JsonIgnoreProperties:直接写在实体类上面value里写出要忽略的字段即可,序列化和反序列化都会被忽略
PS:需要注意一点,这三个注解都会在结果的JSON中屏蔽掉这字段,如果前端需要该字段数据,需要用别的办法传给前端。
有待补充…