单个自定义序列化程序,用于所有嵌入的带注释的对象,用它们的id替换它们

我有这样的实体:

@Entity public Product { @Id public int id; public String name; @ManyToOne(cascade = {CascadeType.DETACH} ) Category category @ManyToMany(cascade = {CascadeType.DETACH} ) Set secondaryCategories; } 

 @Entity public Category { @Id public int id; public String name; @JsonCreator public Category(int id) { this.id = id; } public Category() {} } 

是否可以使用注释来注释Category类或categorysecondaryCategories属性,这些注释将它们序列化为嵌入时的ID。

现在,当我为id = 1的产品进行GET时,我从服务器获取:

 { id: 1, name: "product 1", category: {id: 2, name: "category 2" }, secondaryCategories: [{id: 3, name: "category 3" }, {id: 4, name: "category 4" }, {id: 5, name: "category 5" }] } 

有可能回来:

 { id: 1, name: "product 1", category: 2, secondaryCategories: [3, 4, 5] } 

使用@JsonIdentityReference(alwaysAsId = true)注释Category类通常可以正常工作,但在我获取一个或一个类别列表时也只返回id。 我只在嵌入Category时才需要id转换。

谢谢!

您只需要对类别变量使用@JsonIdentityReference(alwaysAsId = true)

例如:

 @Entity public Product { @Id public int id; public String name; @ManyToOne(cascade = {CascadeType.DETACH} ) @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope=Category.class) @JsonIdentityReference(alwaysAsId = true) Category category; @ManyToMany(cascade = {CascadeType.DETACH} ) Set secondaryCategories; }