在错误下面,我得到了无限递归。
Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSDocumentClass$HibernateProxy$u3IXr3xN["groups"]->org.hibernate.collection.internal.PersistentBag[0]->com.dms.bean.DMSGroupBean["docClasses"]]下面是我的代码
@Entity
@Table(name="DMS_Document_Class")
public class DMSDocumentClass {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="DocumentClass_Index_ID")
private long docClassindexID;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "DOCCLASS_GROUP",
joinColumns = {@JoinColumn(referencedColumnName ="DocumentClass_Index_ID")}, inverseJoinColumns = {@JoinColumn(referencedColumnName="groupID")})
private List<DMSGroupBean> groups;
@Column(name="Document_Class_Name")
private String documentClassName;
@Column(name="Document_Priority")
private int documentPriority;
@Column(name="createdDate")
private Date createdDate;
@Column(name="createdBy")
private String createdBy;另一个类
@Entity
@Table(name="DMS_Group", indexes= @Index(columnList="groupName"),
uniqueConstraints={@UniqueConstraint(columnNames={"groupName"})})
public class DMSGroupBean {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="groupID")
private long groupID;
@Column(name="groupName")
private String groupName;
@Column(name="createDate")
private Date createDate;
@ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
private List<DMSUser> users;
@ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
private List<DMSDocumentClass> docClasses;
@Transient
private String status;我无法理解为什么在UI上获取此值时会出现此错误。
@Transactional
public HashMap<String, Object> getDocListByFolderID(@NonNull long folderID, HttpSession session) {
DMSFolder currentFolder = folderRepo.findById(folderID).get();
List<DMSDocument> documents = documentRepository.findByDocumentFolderID(folderID);
List<DMSFolder> fetchedSubfolders = folderRepo.findByParentFolderID(folderID);
//Allow those folder which has rights for this user
DMSUser userInfo = (DMSUser) session.getAttribute("userinfo");
List<DMSGroupBean> groups = userInfo.getGroups();//userInfo.getGroupRights();
List<DMSFolder> finalSubfolders = fetchFinalSubFolders(groups, fetchedSubfolders);
DMSFolder parentFolder = null;
if(currentFolder.getParentFolderID() != 0) {
parentFolder = folderRepo.findById(currentFolder.getParentFolderID()).get();
}
HashMap<String, Object> docList = new HashMap<String, Object>();
docList.put("currentFolder", currentFolder);
docList.put("documents", documents);
docList.put("subfolders", finalSubfolders);
docList.put("parentFolder", parentFolder);
return docList;
}发布于 2020-03-13 23:15:42
当您拥有StackOverflowException实体的双向关系时,您将获得此JPA。当Jackson试图反序列化它时,它会跟随你的对象图,这个对象图永远不会结束,因为DMSGroupBean和DMSDocumentClass正在引用它自己。
考虑在关系的一个站点上使用@JsonIgnore,如下所示:
@Entity
@Table(name="DMS_Group", indexes= @Index(columnList="groupName"),
uniqueConstraints={@UniqueConstraint(columnNames={"groupName"})})
public class DMSGroupBean {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="groupID")
private long groupID;
@Column(name="groupName")
private String groupName;
@Column(name="createDate")
private Date createDate;
@ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
private List<DMSUser> users;
@ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
@JsonIgnore // here
private List<DMSDocumentClass> docClasses;
@Transient
private String status;
}发布于 2020-03-14 00:56:02
如前所述,是双向映射导致了这个问题。JsonIgnore将解决您的问题,但是,我建议您使用JsonManagedReference和JsonBackReference。不同之处在于JsonIgnore将把字段序列化为null,而JsonBackReference将用它的Ids序列化集合(通过应用于类的JsonIdentityInfo注释)。
@Entity
@Table(name="DMS_Group", indexes= @Index(columnList="groupName"),
uniqueConstraints={@UniqueConstraint(columnNames={"groupName"})})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "groupID")
public class DMSGroupBean {
@ManyToMany(mappedBy = "groups",fetch = FetchType.LAZY)
@JsonManageReference
private List<DMSDocumentClass> docClasses;和
@Entity
@Table(name="DMS_Document_Class")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "docClassindexID")
public class DMSDocumentClass {
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "DOCCLASS_GROUP",
joinColumns = {@JoinColumn(referencedColumnName ="DocumentClass_Index_ID")}, inverseJoinColumns = {@JoinColumn(referencedColumnName="groupID")})
@JsonBackReference
private List<DMSGroupBean> groups;https://stackoverflow.com/questions/60672179
复制相似问题