Spring Boot @JsonIgnore 在实体上,有时我希望将属性作为 Json 返回

Posted

技术标签:

【中文标题】Spring Boot @JsonIgnore 在实体上,有时我希望将属性作为 Json 返回【英文标题】:Spring Boot @JsonIgnore on entity, sometimes I want a property to be returned as Json 【发布时间】:2017-01-08 09:07:59 【问题描述】:

我有一个使用 Spring Boot 构建的 API。 API 将返回食谱。

我有一个 @Entity,其中包含我的食谱的所有属性,包括类别、成分和制作食谱所需的步骤。

我有两个 API 端点,一个返回食谱列表 (/recipes),另一个返回单个食谱的详细信息 (/recipes/49)。

我的问题是,在列出食谱 (/recipes) 的端点中,我不想返回成分和步骤等属性,但我确实想在提供单个食谱详细信息的端点中返回它们 (/食谱/49)。问题是使用 @JsonIgnore 总是从所有 JSON 响应中删除属性,这不是我需要的。

我试图做一些研究,但似乎找不到解决方案,我能想到的唯一方法是始终循环遍历每个配方并填充某种只有必要的响应对象返回它们的端点的属性,但这并不“感觉”正确。

是否有人能够确认您将如何执行此操作?

【问题讨论】:

【参考方案1】:

我遇到了一个可行的解决方案,但需要为我的 Recipes 创建一个新对象,一种 RecipeSummary 对象。

http://glennpaulley.ca/conestoga/2015/05/jpa-and-native-sql-queries-part-deux/

它使用@SqlResultSetMapping 将查询映射到非实体类。

【讨论】:

【参考方案2】:

This blog post 详细介绍了如何使用 @JsonView 注释和视图类来指定从各个端点返回哪些字段。

【讨论】:

虽然乍一看这似乎是完美的解决方案,但遗憾的是它对我不起作用,因为我的食谱列表是由控制器在自定义 api 包装器中返回的。因为我的自定义 api 响应包装器没有在其中定义 JsonView,所以它们不会被返回。 您可以使用 Jackson Mix-in 将 @JsonView 注释应用于 getter。见***.com/a/8477588/1073826【参考方案3】:

看看我的杰克逊插件。我正是为此目的而开发的。

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

【讨论】:

以上是关于Spring Boot @JsonIgnore 在实体上,有时我希望将属性作为 Json 返回的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot @JsonIgnore 在实体上,有时我希望将属性作为 Json 返回

Spring Boot使用@JsonProperty,@JsonIgnore,@JsonFormat注解

避免无限循环 Spring Boot

Spring @JsonIgnore 不起作用

Spring:无法持久使用@JsonIgnore 注释的实体

Spring @JsonIgnore 序列化未按预期工作