我有一个包含30个字段的实体。
目前,我使用PagingAndSortingRepository
提供findAll
和findAllBy
...休息过滤服务。这将返回所有30个字段。
我要求只返回选定的字段。
例如,用户选择field1
,field5
,field11
,field25
,服务应返回仅包含这4个字段的json。
我很感激有关如何执行此操作的任何建议或示例。我能想到的最简单的方法是动态创建查询,但在这种情况下,PagingAndSortingRepository
界面无法看到它。
我需要保持分页和排序功能。
答案 0 :(得分:0)
固定设置解决方案:
如果您有一个预定义的组合属性集(例如,将field1
,field3
和field20
合并为一个用例,并返回field4
和field8
另一个用例)你可以通过多个@JsonView
注释来注释你的POJO(请参阅http://www.baeldung.com/jackson-json-view-annotation以获得更好的解释)。
根据您需要的字段集,您可以根据用户请求的“设置”在控制器中使用正确的视图。
动态设置解决方案1: 如果您确实希望资源返回任何随机组合(事先未知),JsonView将不会删除它。
您可以添加一个自定义BeanPropertyWriter
或自定义序列化程序,它只是跳过(不会调用jsonGen.writeXXX
)以查找未请求的属性。这里的难点是获取所请求的属性(传入您的REST控制器)在编写器/序列化器中已知,这是由Spring的Jackson消息转换器调用的。不是100%确定这可能如何工作,但这将允许您使用相同的POJO。
动态设置解决方案2:
有点单调乏味:您可以使用commons-beanutils
将POJO转换为Map
,而不是仅仅从控制器返回POJO。这样,您就可以展示您的POJO。接下来,您可以从地图中删除键,这些键不属于“请求的字段”列表,并返回Map(或列表/页面),让Jackon知道它的魔力。
这将导致与POJO本身生成的JSON相同,如果您没有使用高级JSON *注释我猜...
这可以应用于任何类型的Object,因此在基础资源中提取此行为或者某些东西可以隐藏繁重的东西。