如果从实体关系调用,则为JsonIgnore属性

时间:2019-01-24 07:34:20

标签: java json spring jackson

我试图有条件地@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 :(得分: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类的集合。