将 @PostFilter 注释应用于通用 Spring Data Jpa 存储库方法
Posted
技术标签:
【中文标题】将 @PostFilter 注释应用于通用 Spring Data Jpa 存储库方法【英文标题】:Applying @PostFilter annotation to a generic Spring Data Jpa repository method 【发布时间】:2014-04-22 18:30:36 【问题描述】:我想在 Spring Data Jpa 存储库通用方法(例如 findAll
)上使用 @PostFilter
注释,如下所示:
@PostFilter("filterObject.isActivated()==true")
public List<Advertisement> findAll();
考虑到这些方法是由 Spring Data Jpa “自动”提供的,因此不会在应用程序代码中公开,我该如何做到这一点?
【问题讨论】:
我可以在获取时进行过滤吗my question 【参考方案1】:是的,您可以将@PostFilter
添加到 Spring Data Repository 提供的任何方法中。只需覆盖现有方法 findAll() 并添加您的 @PostFilter
注释,如示例中所述。不要忘记添加到定义存储库的配置中
<global-method-security pre-post-annotations="enabled" />
或在基于 java 的配置中
@EnableGlobalMethodSecurity(prePostEnabled = true)
分别。 记住。这仅适用于集合和数组。对于像Page 这样的所有其他返回类型,您会得到一个 IllegalArgumentException。实现细节见DefaultMethodSecurityExpressionHandler#filter。
【讨论】:
非常感谢。嗯。您的意思是说应用@PostFilter 的唯一方法是覆盖Spring Data Jpa 提供的findAll 和其他方法吗?如果是这样,它是否违背了开箱即用的目的?不是吗? 这里在某种程度上与 DRY 原则相矛盾。但这只是接口方法的“重新声明”。你不会复制一些现有的代码。所以不要打扰。这种覆盖可能非常有帮助。假设您的 findAll() 方法产生了一个 n+1 问题。此处简化的解决方案:您所要做的就是覆盖 findAll() 方法并通过 @Query 注释提供您自己的 JQPL。 Spring Data 将选择您的查询而不是生成的查询。当然,您也可以使用 AOP 或自定义存储库实现。对于一个简单的用例/应用程序,这已经足够而且干净了。以上是关于将 @PostFilter 注释应用于通用 Spring Data Jpa 存储库方法的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Data 存储库中包含域对象安全 @PostFilter 可分页端点
带有注释的Django查询集,为啥将GROUP BY应用于所有字段?
将@RolesAllowed 注释应用于存储在数据库中的现有用户