我试图有条件地@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;
}
有没有办法实现这种行为?
答案 0 :(得分:1)
您对@ManyToOne
和@OneToMany
的使用不正确,您必须在@OneToMany
实体集合属性的One
实体中使用Many
,反之,反之亦然,@ManyToOne
class A {
@ManyToOne
@JsonBackReference
private B b;
}
class B {
@OneToMany
@JsonManagedReference
private Set<A> collectionOfAs;
}
据我所知,您想忽略所有者B
进行类A
的反向引用,并创建一个stackoverflow异常,以使用注释I在我上面的示例@JsonBackReference
和@JsonManagedReference
中添加了它们,这将停止轨道上的无限循环。
答案 1 :(得分:1)
为避免循环引用无限递归(stackoverflow错误),您必须使用@JsonIdentityInfo注释cals。
所以您的课程看起来像:
@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
答案 2 :(得分:0)
如果类别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的某个对象时,它带来了类Class的对象集,它本身也带来了最初获取的类B的对象,并且除非您在“设置”字段中提供@JsonIgnore,否则这将无限进行。这样,当您调用A类的对象时,也将获取其B类的字段对象,但是当您调用B类的对象时,将忽略其A类的集合。