2018-04-24 10:19:17.394 ERROR 20232 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is 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:
com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->org.hibernate.collection.internal.PersistentSet[0]->com.boot.demo.entity.SysRoleMenu["sysRole"]->com.boot.demo.entity.SysRole["sysRoleMenus"]->com.boot.demo.entity.SysRoleMenu["sysRole"])] with root cause
SysRoleMenu的pojo如下:
@Entity @Table(name = "sys_role_menu") public class SysRoleMenu implements Serializable{ private static final long serialVersion = 1L; private long grantId; /* private Long roleKy; private Long menuKy;*/ private Integer status; private SysRole sysRole; private SysMenu sysMenu; @Id @Column(name = "grant_id") @GeneratedValue(strategy = GenerationType.AUTO) public long getGrantId() { return grantId; } public void setGrantId(long grantId) { this.grantId = grantId; } /*@Basic @Column(name = "role_ky") public Long getRoleKy() { return roleKy; } public void setRoleKy(Long roleKy) { this.roleKy = roleKy; } @Basic @Column(name = "menu_ky") public Long getMenuKy() { return menuKy; } public void setMenuKy(Long menuKy) { this.menuKy = menuKy; }*/ @Basic @Column(name = "status") public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } @Basic @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "role_ky") public SysRole getSysRole() { return sysRole; } public void setSysRole(SysRole sysRole) { this.sysRole = sysRole; } @Basic @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "menu_ky") public SysMenu getSysMenu() { return sysMenu; } public void setSysMenu(SysMenu sysMenu) { this.sysMenu = sysMenu; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SysRoleMenu that = (SysRoleMenu) o; if (grantId != that.grantId) return false; //if (roleKy != null ? !roleKy.equals(that.roleKy) : that.roleKy != null) return false; //if (menuKy != null ? !menuKy.equals(that.menuKy) : that.menuKy != null) return false; if (status != null ? !status.equals(that.status) : that.status != null) return false; return true; } @Override public int hashCode() { int result = (int) (grantId ^ (grantId >>> 32)); // result = 31 * result + (roleKy != null ? roleKy.hashCode() : 0); //result = 31 * result + (menuKy != null ? menuKy.hashCode() : 0); result = 31 * result + (status != null ? status.hashCode() : 0); return result; } }
@Entity @Table(name = "sys_role") public class SysRole implements Serializable{ private static final long serialVersion = 1L; private long roleKy; private String code; private String name; private Integer status; private String remark; private Set<SysRoleMenu> sysRoleMenus = new HashSet<>(); /* private Set<SysUserRole> sysUserRoles = new HashSet<>();*/ @Id @Column(name = "role_ky") @GeneratedValue(strategy = GenerationType.AUTO) public long getRoleKy() { return roleKy; } public void setRoleKy(long roleKy) { this.roleKy = roleKy; } @Basic @Column(name = "code") public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Basic @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "status") public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } @Basic @Column(name = "remark") public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sysRole") public Set<SysRoleMenu> getSysRoleMenus() { return sysRoleMenus; } public void setSysRoleMenus(Set<SysRoleMenu> sysRoleMenus) { this.sysRoleMenus = sysRoleMenus; } //@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sysRole") /*public Set<SysUserRole> getSysUserRoles() { return sysUserRoles; } public void setSysUserRoles(Set<SysUserRole> sysUserRoles) { this.sysUserRoles = sysUserRoles; }*/ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SysRole sysRole = (SysRole) o; if (roleKy != sysRole.roleKy) return false; if (code != null ? !code.equals(sysRole.code) : sysRole.code != null) return false; if (name != null ? !name.equals(sysRole.name) : sysRole.name != null) return false; if (status != null ? !status.equals(sysRole.status) : sysRole.status != null) return false; if (remark != null ? !remark.equals(sysRole.remark) : sysRole.remark != null) return false; return true; } @Override public int hashCode() { int result = (int) (roleKy ^ (roleKy >>> 32)); result = 31 * result + (code != null ? code.hashCode() : 0); result = 31 * result + (name != null ? name.hashCode() : 0); result = 31 * result + (status != null ? status.hashCode() : 0); result = 31 * result + (remark != null ? remark.hashCode() : 0); return result; } }
@Entity @Table(name = "sys_menu") public class SysMenu implements Serializable{ private static final long serialVersion = 1L; private long menuKy; private String name; private String url; private Integer parent; private String image; private Integer grade; private Integer position; private Integer status; private Integer itsSystem; private Set<SysRoleMenu> sysRoleMenus = new HashSet<>(); @Id @Column(name = "menu_ky") @GeneratedValue(strategy = GenerationType.AUTO) public long getMenuKy() { return menuKy; } public void setMenuKy(long menuKy) { this.menuKy = menuKy; } @Basic @Column(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "url") public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Basic @Column(name = "parent") public Integer getParent() { return parent; } public void setParent(Integer parent) { this.parent = parent; } @Basic @Column(name = "image") public String getImage() { return image; } public void setImage(String image) { this.image = image; } @Basic @Column(name = "grade") public Integer getGrade() { return grade; } public void setGrade(Integer grade) { this.grade = grade; } @Basic @Column(name = "position") public Integer getPosition() { return position; } public void setPosition(Integer position) { this.position = position; } @Basic @Column(name = "status") public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } @Basic @Column(name = "itsSystem") public Integer getItsSystem() { return itsSystem; } public void setItsSystem(Integer itsSystem) { this.itsSystem = itsSystem; } @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "sysMenu") public Set<SysRoleMenu> getSysRoleMenus() { return sysRoleMenus; } public void setSysRoleMenus(Set<SysRoleMenu> sysRoleMenus) { this.sysRoleMenus = sysRoleMenus; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SysMenu sysMenu = (SysMenu) o; if (menuKy != sysMenu.menuKy) return false; if (name != null ? !name.equals(sysMenu.name) : sysMenu.name != null) return false; if (url != null ? !url.equals(sysMenu.url) : sysMenu.url != null) return false; if (parent != null ? !parent.equals(sysMenu.parent) : sysMenu.parent != null) return false; if (image != null ? !image.equals(sysMenu.image) : sysMenu.image != null) return false; if (grade != null ? !grade.equals(sysMenu.grade) : sysMenu.grade != null) return false; if (position != null ? !position.equals(sysMenu.position) : sysMenu.position != null) return false; if (status != null ? !status.equals(sysMenu.status) : sysMenu.status != null) return false; if (itsSystem != null ? !itsSystem.equals(sysMenu.itsSystem) : sysMenu.itsSystem != null) return false; return true; } @Override public int hashCode() { int result = (int) (menuKy ^ (menuKy >>> 32)); result = 31 * result + (name != null ? name.hashCode() : 0); result = 31 * result + (url != null ? url.hashCode() : 0); result = 31 * result + (parent != null ? parent.hashCode() : 0); result = 31 * result + (image != null ? image.hashCode() : 0); result = 31 * result + (grade != null ? grade.hashCode() : 0); result = 31 * result + (position != null ? position.hashCode() : 0); result = 31 * result + (status != null ? status.hashCode() : 0); result = 31 * result + (itsSystem != null ? itsSystem.hashCode() : 0); return result; } }
以上错误是由于在SysRole的pojo中引用了private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();
并且SysRoleMenu的pojo中引用了private SysRole sysRole;
SQL语句如下:
@Query(value = "select smr.sysMenu from SysRoleMenu smr where smr.sysRole.roleKy=:roleKy") List<SysMenu> findMenuByRole(@Param("roleKy")Long roleKy);
查询的中造成了死循环,改之后就是将SysRole类中private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();去掉,
SysMenu类中的private Set<SysRoleMenu> sysRoleMenus = new HashSet<>();去掉,
只保留SysRoleMenu类中的private SysRole sysRole; 和 private SysMenu sysMenu ;
重新启动再跑一遍就没有问题了