Рекурсивный JSON java

При запуске сервера застреваю.

Данные

Видимо дело в моделях, но непонятно какие.

Подключение к базе через JPA.

Пользователь

@Entity
@Table (name = "User")
public class User implements UserDetails {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "name", nullable = false)
private String name;

@Column(name = "surname")
private String surname;

@Column(name = "password")
private String password;

@ManyToMany(fetch = FetchType.EAGER, /*cascade = CascadeType.ALL,*/ 
targetEntity = Role.class)
@JoinTable(name = "user_role",
        joinColumns = {@JoinColumn(name = "user_id")},
        inverseJoinColumns = {@JoinColumn(name = "role_id")})
private Set<Role> roles;

public User() {
}

public User(String name, String surname) {
    this.name = name;
    this.surname = surname;
}

public User(String name, String surname, String password, Set<Role> roles) {
    this.name = name;
    this.surname = surname;
    this.password = password;
    this.roles = roles;

}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSurname() {
    return surname;
}

public void setSurname(String surname) {
    this.surname = surname;
}

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

public String getPass() {
    return password;
}

public Set<Role> getRoles() {
    return roles;
}

public void setRoles(Set<Role> roles) {
    this.roles = roles;
}

@Override
public String toString() {
    return "User{" +
            "id = " + id +
            ", name='" + name + '\'' +
            ", surname='" + surname + '\'' +
            //", role='" + roles.toString() + '\'' +
            '}';
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    Set<Role> roleList = new HashSet<>();
    roleList.addAll(roles);
    return roleList;
}

@Override
public String getPassword() {
    return password;
}

@Override
public String getUsername() {
    return name;
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;

}

@Override
public boolean isEnabled() {
    return true;
}

}

Роль

@Entity
@Table(name = "Role")
public class Role implements GrantedAuthority {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "roleName", length = 20, nullable = false)
private String roleName;

//private String role;

@ManyToMany(fetch = FetchType.EAGER, /*mappedBy = "roles",*/ targetEntity = 
User.class)
@JoinTable(name = "user_role",
        joinColumns = {@JoinColumn(name = "role_id")},
        inverseJoinColumns = {@JoinColumn(name = "user_id")})
private List<User> users;

public Role() {
}

public Role(String roleName) {
    this.roleName = roleName;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public Collection<User> getUsers() {
    return users;
}

public void setUsers(List<User> users) {
    this.users = users;
}


public String getRoleName() {
    return roleName;
}

public void setRoleName(String roleName) {
    this.roleName = roleName;
}

@Override
public String toString() {
    return "Role with id " + id + " and name " + roleName;
}

public String getAuthority() {
    return getRoleName();
}

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Role role = (Role) o;
    return Objects.equals(roleName, role.roleName);
}

@Override
public int hashCode() {
    return Objects.hash(roleName);
}

}

Думал, это каскад и FetchType. Но вроде все правильно.

Я пробовал использовать toString для связи от пользователя к роли и наоборот. Тоже безрезультатно. Спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
160
1

Ответы 1

Вы должны использовать аннотацию @JsonIgnore над получателем одного из двух классов, позвольте мне объяснить: когда вы вызываете объект пользователя, он использует объект роли, вызываемый объект роли содержит объект пользователя, поэтому он использует другой объект пользователя, и поскольку у вас есть бесконечный цикл user -> role -> user -> role -> user -> role ..... @JsonIgnore API-интерфейса jackson делает, когда вы вызываете объект пользователя, он получит его без роли, вызов роли будет выполнен, когда вы используете getRole (). Надеюсь, это будет полезно

На добытчике или на поле. Я рекомендую добавить @JsonIgnore в поле users в классе Role, потому что вы, вероятно, не хотите, чтобы роль перечисляла всех пользователей, которых она содержит.

coladict 02.11.2018 10:51

Вы бы хотели принять мой ответ, если он отвечает на ваш вопрос

Omar Amaoun 02.11.2018 15:26

Другие вопросы по теме