有时候我们希望实体类转成json的时候,把一方和多方都转成json,即双向关联。这种将Object转化为JSON数据的方法比较常见,但是它这个架包识别不到@JsonIgnoreProperties和@JsonIgnore这个注解,因为他们不是同一个架包,不是同一个规范,所以在转化JSON的时候,还是会发生循环引用的问题。
简单实用的例子如下:
一方的实体,中有多方的关联
public class CgFormHeadEntity implements java.io.Serializable {
private List<CgFormFieldEntity> columns;
@OneToMany(cascade=CascadeType.REMOVE,mappedBy="table") @OrderBy(clause="orderNum asc")
public List<CgFormFieldEntity> getColumns() {
return columns;
}
public void setColumns(List<CgFormFieldEntity> columns) {
this.columns = columns;
}
}
多方的实体,一方的关联
public class CgFormFieldEntity implements java.io.Serializable {
private CgFormHeadEntity table;
@ManyToOne
@JoinColumn(name ="table_id",nullable=false,referencedColumnName="id")
@JsonIgnore//还是会发生循环引用的问题
@ForeignKey(name="null")
public CgFormHeadEntity getTable(){
return this.table;
}
public void setTable(CgFormHeadEntity table){
this.table = table;
}
}
进行一方的实体的json配置,return true代表过滤这个属性,不进行转json,下面的配置指明过滤实体中名字为table,且数据类型为CgFormHeadEntity的属性。这个配置应用在CgFormHeadEntity 的对象转json的时候,会把CgFormHeadEntity 实体中的属性,包括columns属性转json,之所以过滤table的原因是,转columns属性为json的时候,把columns集合里的一方的引用过滤掉,从而防止死循环。
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setJsonPropertyFilter(new PropertyFilter() {
public boolean apply(Object obj, String name, Object value) {
if(value instanceof CgFormHeadEntity&&name.equals("table")){
return true;
}else{
return false;
}
}
});
用法:
CgFormHeadEntity table = (CgFormHeadEntity) sysProcessService.findUniqueByProperty
(CgFormHeadEntity.class, "tableName",sysParams.getParamsType());
JSONArray json= JSONArray.fromObject(table.getColumns(), jsonConfig);
String str= json.toString();//一定要转字符串,要不然,前端获取数据时,还回死循环