Почему RESTcontroller возвращает один и тот же результат много раз в JSON? - PullRequest
1 голос
/ 08 июля 2019

Мой контроллер покоя возвращает тот же объект за бесконечное время для объекта USER. Другие объекты, которые не требуют объекта USER, работают нормально. Что случилось? Если я удаляю некоторые геттеры / сеттеры, это работает нормально, но мне на самом деле нужно все здесь ... Spring генерирует исключения - StackOverFlow exc и Java.lang.IllegalStateException: невозможно вызвать sendError () после подтверждения ответа

РЕДАКТИРОВАТЬ: я понял, что проблема "getRoles ()" - к сожалению, это очень важно для меня, и мне нужно включить его в JSON ... Как заставить это работать?

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "first_name")
    private String firstName;
    private String surname;
    private String email;
    private String password;

    @ManyToMany
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(
                    name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(
                    name = "role_id", referencedColumnName = "id"))
    private List<Role> roles;

    @JsonIgnore
    @ManyToMany
    @JoinTable(
            name="users_documents",
            joinColumns = @JoinColumn(
                    name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(
                    name="document_id", referencedColumnName = "id"))
    private List<Document> usersDocuments;


    @OneToMany(mappedBy="user")
    private List<Document> sharedDocuments;


    public User() {

    }

    public User(String firstName, String surname, String email, String password) {
        this.firstName = firstName;
        this.surname = surname;
        this.email = email;
        this.password = password;
    }

    public long getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return surname;
    }

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

    public void setEmail(String email) {
        this.email = email;
    }

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

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

    public String getEmail() {
        return email;
    }

    public String getPassword() {
        return password;
    }


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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof User)) return false;
        User user = (User) o;
        return getId() == user.getId();
    }

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

    @Override
    public String toString() {
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", surname='" + surname + '\'' +
                ", email='" + email + '\'' +
                ", roles=" + roles +
                '}';
    }
}

1 Ответ

0 голосов
/ 09 июля 2019

Не уверен, возможно ли это конкретно для ваших данных, но я смог решить проблему с помощью набора вместо списка только для сопоставленных коллекций, с которыми у меня возникли проблемы.

Я заметил, что многие обвиняют Джексона в этом вопросе. Хотя, в моем случае, я заметил, что установка FetchType в Lazy устранила проблему без необходимости изменять тип Collection.

Полагаю, это не поможет вашей ситуации, так как вам все равно нужно создавать экземпляры всех этих полей, и в этом случае ленивая загрузка будет бесполезной.

Тем не менее, вы можете захотеть взглянуть на все места в вашем коде, в которых вы создаете экземпляры объектов с ассоциациями с другими объектами, и проверить, не создаются ли какие-либо дополнительные объекты с нетерпением.

Ваш метод equals (), похоже, полностью соответствует передовому опыту. Хотя, на самом деле, я не уверен, что вы создаете там объект User, и в этом случае, как побочный эффект, связанные объекты User будут созданы с энтузиазмом.

Я могу быть ужасно неправ в этом (извините, в данный момент я не могу проверить), но вы можете следить за подобными сценариями, если вы застряли и не можете ни использовать ленивую загрузку, ни выбирать «Наборы над списками» в проблемные случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...