将 @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 注释应用于存储在数据库中的现有用户

使用IE条件注释将类应用于body标记

将 mypy 的通用 self 与 python2 类型注释一起使用

适用于移动和电视的 Android 通用应用程序 (Lollipop)