有没有办法让"@JsonBackReference"仅在元素在集合中时才工作,而在独立时不工作?



我使用的是fasterxml,我有两个对象有一个关系"一对多";或";多对一";。例如类Author和类Book,一个作者有许多书,一本书有一个作者。我可以告诉fasterxml不要序列化这本书的作者吗?只有当这本书在作者的图书收藏中时,才序列化,但如果这本书是自己的,就序列化。

作者类别:

public class Author{
public int id;
public string name;
@JsonManagedReference
public Set<Book> books;
}

图书类别:

public class Book{
public int id;

public string name;
@JsonBackReference
public Author author;
}

如果我只想得到作者,这个设置很好,因为书已经就位,他们的author属性没有被序列化,但如果我只想要序列化书,它的author也没有被序列化@JsonBackReference";注释。在上述情况下有什么变通办法吗?如果你不明白我的意思,下面还有一些例子。。。

当我序列化Autor:

{
id:3,
name: "Ivan Vazov"
books:[
{
id:5,
name: "Under the Yoke"
}
]
}

这就是我在这里想要的。

当我连载一本书时:

{
id:5,
name: "Under the Yoke"
}

但我不想要这个,我想要这个:

{
id:5,
name: "Under the Yoke",
author: {
id:3,
name: "Ivan Vazov"
}
}

对这件事有任何想法都会很棒!谢谢

如果你想从两边序列化引用(Book,Author(,那么jackson就会面临循环引用的问题,在序列化这两个对象中的一个时,它会陷入引用的无休止循环中。

解决方法是使用@JsonManagedReference@JsonBackReference,其中jackson忽略了一侧,只序列化了另一侧,以避免循环引用。

问题的解决方案(当你想序列化双方时(是创建单独的DTO对象(AuthorDto,BookDto(,而不是从你的控制器返回一个要序列化的Author,而是返回一个AuthorDdo。与Book相同。然后循环引用问题不再存在,双方都将有问题的引用序列化。

DTO是在更复杂的场景中进行的方法,尤其是在入站端。为了对更简单的用例进行动态过滤,我为jackson编写了一个使用antpath风格过滤的插件。也许它对你有帮助:

https://github.com/Antibrumm/jackson-antpathfilter

您在ManyToOne关系端添加了fetch类型,如下所示。

要获取所有图书实体,请添加获取类型Eagle。

@ManyToOne(fetch=FetchType.EAGER,可选=错误)

若要仅获取图书实体,请添加"获取惰性"。

@ManyToOne(fetch=FetchType.LAZY,可选=错误)

相关内容

  • 没有找到相关文章

最新更新