我有一个包含 30 个字段的实体。
目前我使用PagingAndSortingRepository
来提供findAll
和findAllBy
...其余过滤服务。这将返回所有 30 个字段。
我需要仅返回选定的字段。
例如,用户选择field1
、field5
、field11
、field25
,服务应返回仅包含这4个字段的json。
如果有任何关于如何执行此操作的建议或示例,我将不胜感激。我能想到的最简单的方法是动态创建查询,但在这种情况下,PagingAndSortingRepository
接口(interface)看不到它。
我需要维护分页和排序功能。
最佳答案
固定集解决方案:
如果您有预定义的组合属性集(例如,为一个用例组合 field1
、field3
和 field20
,并为另一个用例返回 field4
和 field8
),您可以使用多个 @JsonView
注释来注释 POJO(请参阅 http://www.baeldung.com/jackson-json-view-annotation 以获取详细说明)。
根据您需要的字段集,您可以根据用户请求的“集”在 Controller 中使用正确的 View 。
动态集解决方案1: 如果您实际上希望资源返回字段的任何随机组合(事先不知道),JsonView 不会剪切它。
您可以改为添加一个自定义 BeanPropertyWriter
或自定义序列化程序,它只是跳过(不调用 jsonGen.writeXXX
)未请求的属性。这里的困难在于让编写器/序列化器(由 Spring 的 Jackson 消息转换器调用)知道所请求的属性(传递到 REST Controller )。不能 100% 确定这可能如何工作,但这将允许您使用相同的 POJO。
动态集解决方案2:
有点乏味:您可以使用 commons-beanutils
将 POJO 转换为 Map
,而不是仅仅从 Controller 返回 POJO。这样,您将获得 POJO 的扁平化表示。接下来,您可以从 map 中删除不属于“请求字段”列表的键,然后返回 map (或列表/页面)并让 Jackon 发挥它的魔力。
如果您不使用高级 JSON* 注释,我猜这将生成与 POJO 本身生成的 JSON 相同的结果...
这可以应用于任何类型的对象,因此在基础资源或可以稍微隐藏繁重工作的东西中提取此行为。
关于java - Spring JpaRepositor返回选定的pojo字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47209647/