Свойство JsonIgnore, если вызывается из отношения сущности - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь условно @JsonIgnore некоторые поля из сущности, если они сериализованы из коллекции другой сущности (от многих к одному).

Я пытался добавить @JsonIgnoreProperties кколлекция, но, как я понимаю, аннотация не для этой цели.

class A {
    //some fields

    @ManyToOne private B b; //if only A is requested, this should NOT be ignored    
}

class B {
    //some fields

    @OneToMany
    @IgnorePrivateBInAToAvoidStackOverflow
    private Set<A> collectionOfAs;
}

Есть ли способ достичь этого поведения?

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Вы используете @ManyToOne & @OneToMany неправильно, вы должны использовать @OneToMany в сущности One в свойстве Many для коллекции сущностей и наоборот для @ManyToOne

class A {

    @ManyToOne 
    @JsonBackReference
    private B b;
}

class B {

    @OneToMany
    @JsonManagedReference
    private Set<A> collectionOfAs;
}

и, насколько я понимаю, вы хотели бы игнорировать владельца B для выполнения обратной ссылки из класса A и создать исключение stackoverflow, чтобы добиться этого, используя аннотацию, которую я добавил в мой пример выше @JsonBackReference & @JsonManagedReference, который остановит бесконечный цикл на своих треках.

0 голосов
/ 24 января 2019

Чтобы избежать циклической ссылки Бесконечная рекурсия (ошибка переполнения стека), вы должны аннотировать calss с помощью @ JsonIdentityInfo

Итак, ваш класс выглядит так:

@JsonIdentityInfo(
       generator = ObjectIdGenerators.PropertyGenerator.class, 
       property = "id")
class A {
    //some fields
    //Integer id;


    @OneToMany private B b; //if only A is requested, this should NOT be ignored    
}

То же самое для класса B для двунаправленного использования:

@JsonIdentityInfo(
       generator = ObjectIdGenerators.PropertyGenerator.class, 
       property = "id")
class B {
    //some fields

    @ManyToOne
    @IgnorePrivateBInAToAvoidStackOverflow
    private Set<A> collectionOfAs;
} 

имейте в виду, что property относится к вашему уникальному имени поля (в этом примере установите id)

для дополнительной информации см. статью

0 голосов
/ 24 января 2019

Если класс B имеет коллекцию класса A, тогда набор A в классе B должен быть аннотирован @OneToMany, а поле в классе A должно быть аннотировано @ManyToOne, тогда вы можете поставить свой @JsonIgnore нанабор примерно так:

class A {
    //some fields

    @ManyToOne private B b; //if only A is requested, this should NOT be ignored    
}

class B {
    //some fields


    @OneToMany
    @JsonIgnore
    private Set<A> collectionOfAs;
}

Я предполагаю, что вы получали ошибку StackOverflow, потому что когда вы выбирали какой-то объект класса B, он приносил с собой набор объектов класса As, который сам приносилтот же объект класса B, который был первоначально извлечен, и это будет происходить бесконечно, если вы не предоставите @JsonIgnore в поле Set.Таким образом, при вызове объекта класса A их объект поля класса B также будет выбран, но при вызове объекта класса B их коллекция класса As будет игнорироваться.

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