Spring Boot - Джексон не может POST / PUT при использовании полей списка (@ManyToMany) - PullRequest
0 голосов
/ 05 февраля 2020

Объяснение

Я сделал пример кода для тестирования методов http, к моему удивлению, я обнаружил проблему при попытке преобразовать JSON в объект в полях списка, он вылетел , но как только я удаляю это поле, все работает нормально.


Пример структуры (пропущенные поля, такие как id для этого примера)

{
    "name": "One",
    "child": {
        "name": "Two",
        "nested": [
            {
                "name": "Three"
            }
        ]
    }
}

Ожидается

Возможность POST и PUT , ошибка выдается на данный момент.

Actual

Я получаю сообщение об ошибке, но как только я удаляю это поле Nested , все работает нормально, также GET и DELETE работают нормально, даже если там есть поле Nested .

Выдается ошибка

Не удалось оценить десериализацию Джексона для типа [[простой тип, класс com.base.project.Parent ]]: com.faster xml .jackson.databind.ex c .InvalidDefinitionException: Cannot hand Управляемая / обратная ссылка 'defaultReference': тип обратной ссылки (java .util.List ) не совместим с управляемым типом ( com.base.project.Child )


Я собираюсь пропустить некоторые поля, чтобы это не стало кластером


class Parent ( верхний слой, имеет имя One в структуре, показанной сверху)

@JsonManagedReference // I already tried removing this
@OneToOne(mappedBy = "parent", cascade {...})
private Child child;

класс Child (средний слой, имеет имя Два в структуре, показанной вверху)

@JsonBackReference
@OneToOne(cascade = {...})
@JoinColumn(name = "parent_id")
private Parent parent;

@JsonManagedReference // I already tried removing this
@ManyToMany(mappedBy = "child", cascade = {...})
private List<Nested> nested;

класс Nested (нижний слой, имеет название Три в структуре, показанной вверху)

@JsonBackReference
@ManyToMany(cascade = {...})
@JoinTable(...)
private List<Child> child;

То, что я пробовал

  • Удаление @ JsonManagedReference
  • Добавлено @JsonIdentityInfo к трем классам
  • Использование @JsonProperty для реляционных полей
  • Удаление поля Nested (@ManyToMany), только тогда это работает штраф

1 Ответ

0 голосов
/ 05 февраля 2020

Исходная проблема, как описано

Решением было удаление любого @JsonManagedReference, кроме того, из верхнего слоя, поэтому в моем примере Parent - единственный тот, кто имеет эту аннотацию, два других ( Child и Nested просто используют @JsonBackReference)

Обратите внимание, я знаю, что в значительной степени Child класс является «родителем» для класса Nested , однако добавление к нему @JsonManagedReference приводило к ошибке, поэтому опять же, верхний слой - единственный, кому это нужно, для по какой-то причине.

Исправлен только метод POST .


Вторая проблема: метод PUT не обнаруживал идентификатор ни из одной из childs

Предоставление id в теле JSON приводило к ошибке, однако после удаления поля id все было в порядке ( хотя по понятным причинам я не мог обновить их в базе данных )

, я поставил следующее в верхней части моих трех классов

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")

( id - это имя поля в моем классе, в котором хранится ... id )

Не цитируйте меня по этому вопросу , но я считаю, что наличие этой аннотации вдоль @JsonManagedReference и @JsonBackReference вызывало какую-то проблему в методе PUT , POST не затрагивалось вообще.

Само собой разумеется, как только я удалил @JsonIdentityInfo, оставив две другие, решить проблему.

Это исправило метод PUT .

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