【问题标题】:Applying @PostFilter annotation to a generic Spring Data Jpa repository method将 @PostFilter 注释应用于通用 Spring Data Jpa 存储库方法
【发布时间】:2014-04-22 18:30:36
【问题描述】:

我想在 Spring Data Jpa 存储库通用方法(例如 findAll)上使用 @PostFilter 注释,如下所示:

@PostFilter("filterObject.isActivated()==true")
public List<Advertisement> findAll();

考虑到这些方法是由 Spring Data Jpa “自动”提供的,因此不会在应用程序代码中公开,我该如何做到这一点?

【问题讨论】:

标签: spring spring-security aop aspectj spring-data-jpa


【解决方案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 或自定义存储库实现。对于一个简单的用例/应用程序,这已经足够而且干净了。
猜你喜欢
  • 1970-01-01
  • 2018-06-15
  • 2018-08-27
  • 2012-03-08
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多