jackson JsonIgnore属性(如果从实体关系调用)

gxwragnw  于 2022-11-08  发布在  其他
关注(0)|答案(4)|浏览(124)

我尝试有条件地@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;
}

有没有什么方法可以实现这种行为呢?

unhi4e5o

unhi4e5o1#

要避免循环引用无限递归(堆栈溢出错误),必须使用@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
有关更多阅读,请参阅article

q1qsirdb

q1qsirdb2#

@ManyToOne & @OneToMany的用法不正确,必须在Many实体集合属性上的One实体内使用@OneToMany,对于@ManyToOne则相反

class A {

    @ManyToOne 
    @JsonBackReference
    private B b;
}

class B {

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

就我所能理解的,您希望忽略所有者B,以便从类A执行反向引用,并创建一个stackoverflow异常,要实现这一点,请使用我在上面的示例@JsonBackReference & @JsonManagedReference中添加的注解,它将停止无限循环。

z2acfund

z2acfund3#

如果类B有一个类A的集合,那么类B中A的集合应该被标注为@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类的对象时,它带来了A类对象的集合,而这些集合本身又带来了原来获取的B类的同一个对象,除非你在集合字段中提供@JsonIgnore,否则这将是无限期的。这样,当你调用A类的对象时,它们的类B的字段对象也将被获取,但是当你调用类B的对象时,它们的类A的集合将被忽略。

rkue9o1l

rkue9o1l4#

这应该和@JsonIgnoreProperties一起工作

class A {
    //some fields

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

class B {
    //some fields

    @OneToMany
    @JsonIgnoreProperties({'b', 'otherField'})
    private Set<A> collectionOfAs;
}

相关问题