我尝试有条件地@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;
}
有没有什么方法可以实现这种行为呢?
4条答案
按热度按时间unhi4e5o1#
要避免循环引用无限递归(堆栈溢出错误),必须使用@JsonIdentityInfo注解类
所以你的类看起来像:
B类双向使用的情况相同:
请注意,
property
指的是唯一的字段名(在本例中设置为id
)有关更多阅读,请参阅article
q1qsirdb2#
@ManyToOne
&@OneToMany
的用法不正确,必须在Many
实体集合属性上的One
实体内使用@OneToMany
,对于@ManyToOne
则相反就我所能理解的,您希望忽略所有者
B
,以便从类A
执行反向引用,并创建一个stackoverflow异常,要实现这一点,请使用我在上面的示例@JsonBackReference
&@JsonManagedReference
中添加的注解,它将停止无限循环。z2acfund3#
如果类B有一个类A的集合,那么类B中A的集合应该被标注为
@OneToMany
,而类A中的域应该被标注为@ManyToOne
,那么你可以把你的@JsonIgnore
放在集合上,如下所示:我猜你收到StackOverflow错误是因为当你获取某个B类的对象时,它带来了A类对象的集合,而这些集合本身又带来了原来获取的B类的同一个对象,除非你在集合字段中提供@JsonIgnore,否则这将是无限期的。这样,当你调用A类的对象时,它们的类B的字段对象也将被获取,但是当你调用类B的对象时,它们的类A的集合将被忽略。
rkue9o1l4#
这应该和
@JsonIgnoreProperties
一起工作