简体   繁体   English

尝试将List从数据库转换为Java中的json时的Stackoverflow

[英]Stackoverflow while trying to convert List from database to json in Java

I have a problem. 我有个问题。 Here my entities user and userRole 这里是我的实体user和userRole

User 用户

package com.springapp.model;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "users", catalog = "users")
public class User {

private String username;
private String password;
private boolean enabled;
private String email;


private String token;
private Set<UserRole> userRole = new HashSet<UserRole>(0);

public User() {
    this.enabled=false;
}

@Column(name = "token",
        nullable = false, length = 80)
public String getToken() {
    return this.token;
}

public void setToken(String token) {
    this.token = token;
}

public String getEmail() {
    return this.email;
}
@Column(name = "email",
        nullable = false, length = 80)
public void setEmail(String email) {
    this.email = email;
}

@Id
@Column(name = "username", unique = true,
        nullable = false, length = 45)
public String getUsername() {
    return this.username;
}

public void setUsername(String username) {
    this.username = username;
}

@Column(name = "password",
        nullable = false, length = 60)
public String getPassword() {
    return this.password;
}

public void setPassword(String password) {
    this.password = password;
}

@Column(name = "enabled", nullable = false)
public boolean isEnabled() {
    return this.enabled;
}

public void setEnabled(boolean enabled) {
    this.enabled = enabled;
}

@OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
public Set<UserRole> getUserRole() {
    return this.userRole;
}

public void setUserRole(Set<UserRole> userRole) {
    this.userRole = userRole;
}

}

UserRole UserRole的

package com.springapp.model;

import javax.persistence.*;

import static javax.persistence.GenerationType.IDENTITY;

@Entity
@Table(name = "user_roles", uniqueConstraints = @UniqueConstraint(
            columnNames = { "role", "username" }))
public class UserRole{

private Integer userRoleId;
private User user;

private String role;

public UserRole() {
}

public UserRole(User user, String role) {
    this.user = user;
    this.role = role;
}

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_role_id",
        unique = true, nullable = false)
public Integer getUserRoleId() {
    return this.userRoleId;
}

public void setUserRoleId(Integer userRoleId) {
    this.userRoleId = userRoleId;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username", nullable = false)
public User getUser() {
    return this.user;
}

public void setUser(User user) {
    this.user = user;
}

@Column(name = "role", nullable = false, length = 45)
public String getRole() {
    return this.role;
}

public void setRole(String role) {
    this.role = role;
}

}

Now I want to get list of users with lists of their roles to json using gson lib 现在我想使用gson lib获取带有json角色列表的用户列表

 List<User> users = userService.showAllUsers();
 Gson gson = new Gson();
 return  gson.toJson(users);

But it fails with stackoverflow error. 但它因stackoverflow错误而失败。 I think it's because every user refers to roles and roles refers to users (because we have User user in Userroles and Set of roles in users). 我认为这是因为每个用户都指的是角色和角色是指用户(因为我们在Userroles中有用户用户,在用户中有角色集)。 And it turns "recursion". 它变成了“递归”。 How can I avoid this error? 我怎样才能避免这个错误?

That happens when you bidirectional associations and JSon doesn't ignore one side. 当你的双向关联和JSon不忽略一方时会发生这种情况。

You need to mark the many-to-one side with @JsonIgnore : 您需要使用@JsonIgnore标记多对一方:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "username", nullable = false)
@JsonIgnore
public User getUser() {
    return this.user;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM