今天遇到了json返回的list集合在前台遍历显示为undefined的问题,搞了半天终于搞定了,以前也遇到过这问题,不过误打误撞的通过建中间类的形式给解决了,不过建中间类很坑爹啊有不有,这里说一下解决方法。
我出现的问题是在前台遍历json返回的list集合,但结果只有第一条数据显示,其他的数据都显示undefined。
原因是集合所保存的类和数据库的其他表之间有一对多或多对一的关系,在转json的时候会死循环报错,解决办法是在‘一’里面对“多”的那个引用的get方法上加注解:
例如:
Headtitle.java
package jikon.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.alibaba.fastjson.annotation.JSONField;
/**
* Headtitle entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "headtitle", catalog = "jikon")
public class Headtitle implements java.io.Serializable {
// Fields
private Integer id;
private String name;
private Set<Sontitle> sontitles = new HashSet<Sontitle>(0);
// Constructors
/** default constructor */
public Headtitle() {
}
/** full constructor */
public Headtitle(String name, Set<Sontitle> sontitles) {
this.name = name;
this.sontitles = sontitles;
}
// Property accessors
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "name", length = 50)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "headtitle")
@JSONField(serialize=false)
public Set<Sontitle> getSontitles() {
return this.sontitles;
}
public void setSontitles(Set<Sontitle> sontitles) {
this.sontitles = sontitles;
}
}
Sontitle.java:
package jikon.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.alibaba.fastjson.annotation.JSONField;
/**
* Sontitle entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "sontitle", catalog = "jikon")
public class Sontitle implements java.io.Serializable {
// Fields
private Integer id;
private Headtitle headtitle;
private String name;
private Set<Article> articles = new HashSet<Article>(0);
// Constructors
/** default constructor */
public Sontitle() {
}
/** full constructor */
public Sontitle(Headtitle headtitle, String name, Set<Article> articles) {
this.headtitle = headtitle;
this.name = name;
this.articles = articles;
}
// Property accessors
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "headTitleId")
public Headtitle getHeadtitle() {
return this.headtitle;
}
public void setHeadtitle(Headtitle headtitle) {
this.headtitle = headtitle;
}
@Column(name = "name", length = 50)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sontitle")
@JSONField(serialize=false)
public Set<Article> getArticles() {
return this.articles;
}
public void setArticles(Set<Article> articles) {
this.articles = articles;
}
}
Headtitle和Sontitle之间是一对多的关系,所以在Headtitle中的Sontitle引用的get方法上加上“@JSONField(serialize=false)”注解,防止其序列化。