有没有办法让“@JsonBackReference”仅在元素处于 collection 时起作用,但在独立时不起作用?
Is there a way to get "@JsonBackReference" only working when the element is in a collection, but not when standalone?
我正在使用 fasterxml,我有两个 objects 具有“一对多”或“多对一”关系。例如 class 作者和 class 书,一个作者有很多书,一本书有一个作者。我可以告诉 fasterxml 不要序列化这本书的作者,只有当这本书在它的作者的书中时 collection,但是当这本书在它自己身上时,才序列化它。
作者 class:
public class Author{
public int id;
public string name;
@JsonManagedReference
public Set<Book> books;
}
图书class:
public class Book{
public int id;
public string name;
@JsonBackReference
public 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"
}
}
任何关于此事的想法都会很棒!谢谢。
您已在 ManyToOne 关系端添加提取类型,如下所示。
要获取所有图书实体,然后添加获取类型 Eager。
@ManyToOne(
提取 = FetchType.EAGER,
可选=假
)
只获取图书实体然后添加延迟获取。
@ManyToOne(
获取 = FetchType.LAZY,
可选=假
)
如果您希望从双方(书籍、作者)序列化引用,那么 jackson 会面临循环引用的问题,在序列化这两个对象之一时,它会陷入无限的引用循环。
解决方法是 @JsonManagedReference
和 @JsonBackReference
,其中杰克逊忽略了一侧并仅序列化另一侧以避免循环引用。
你的问题的解决方案(当你想序列化双方时)是创建单独的 DTO 对象(AuthorDto,BookDto),而不是从你的控制器中 return ing a Author to be serialized you return 一个 AuthorDto。与书相同。这样循环引用问题就不存在了,双方都序列化了有问题的引用。
DTO 是在更复杂的场景中使用的方法,尤其是在入站端。对于更简单用例的动态过滤,我为 jackson 编写了一个插件以使用 antpath 样式过滤。可能对你有帮助:
我正在使用 fasterxml,我有两个 objects 具有“一对多”或“多对一”关系。例如 class 作者和 class 书,一个作者有很多书,一本书有一个作者。我可以告诉 fasterxml 不要序列化这本书的作者,只有当这本书在它的作者的书中时 collection,但是当这本书在它自己身上时,才序列化它。
作者 class:
public class Author{
public int id;
public string name;
@JsonManagedReference
public Set<Book> books;
}
图书class:
public class Book{
public int id;
public string name;
@JsonBackReference
public 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"
}
}
任何关于此事的想法都会很棒!谢谢。
您已在 ManyToOne 关系端添加提取类型,如下所示。
要获取所有图书实体,然后添加获取类型 Eager。
@ManyToOne( 提取 = FetchType.EAGER, 可选=假 )
只获取图书实体然后添加延迟获取。
@ManyToOne( 获取 = FetchType.LAZY, 可选=假 )
如果您希望从双方(书籍、作者)序列化引用,那么 jackson 会面临循环引用的问题,在序列化这两个对象之一时,它会陷入无限的引用循环。
解决方法是 @JsonManagedReference
和 @JsonBackReference
,其中杰克逊忽略了一侧并仅序列化另一侧以避免循环引用。
你的问题的解决方案(当你想序列化双方时)是创建单独的 DTO 对象(AuthorDto,BookDto),而不是从你的控制器中 return ing a Author to be serialized you return 一个 AuthorDto。与书相同。这样循环引用问题就不存在了,双方都序列化了有问题的引用。
DTO 是在更复杂的场景中使用的方法,尤其是在入站端。对于更简单用例的动态过滤,我为 jackson 编写了一个插件以使用 antpath 样式过滤。可能对你有帮助: