将参数注入 spring-data 动态查询构建方法

Inject parameter into spring-data dynamic query-build methods

我想知道是否可以将一些功能注入动态生成的 CrudRepository 查询方法中,以便为存储库中的所有方法提供额外的 filterBy 条件。

短版,我要

    Page<Collection> findByName(@Param("name") String name);

像命名一样工作

    Page<Collection> findByNameAndGroup(@Param("name") String name);

我在 impl 创建时将 AndGroup 条件添加到为回购方法生成的代码中。 我不想在任何地方都添加它,因为它将在所有方法上添加,并且参数已经知道。

我最初的想法是扩展 repo class,并添加一些新的方法来调用生成的带有添加参数的方法,但后来我意识到 repo 只定义为一个接口,所以一个不能扩展它,添加任何 impl 都会影响 spring-data impl 的生成。至少,我认为它是这样工作的..

详情:

我有一个 MongoRepository,它有很多使用 spring-data query-builder 语法生成的 API 方法。 (http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.query-methods.query-creation)

主要回购 class:

@RepositoryRestResource
public interface CollectionRepository extends MongoRepository<Collection, String> {

    Page<Collection> findByName(@Param("name") String name);
    Page<Collection> findByNameRegex(@Param("name") String name);
    // lots more findBy methods here...
}

repo 对象、集合只是一个具有名称和组 ID 的对象:

@Document
public class Collection {
    private String name;
    private String group;
}

我的认证用户对象是:

@Document
public class Collection {
    private String username;
    private String password;
    private String group;
}

在所有情况下,用户组都需要过滤用户可以看到的集合。

上面每一个findBy...()都需要变成一个findBy...AndGroup(),这是可能的,因为group是集合中的一个元素。

简单的方法是简单地将新参数添加到每个方法中,即:

@RepositoryRestResource
public interface CollectionRepository extends MongoRepository<Collection, String> {

    Page<Collection> findByNameAndGroup(@Param("name") String name);
    Page<Collection> findByNameRegexAndGroup(@Param("name") String name);
    // lots more methods here...
}

这也使得客户端不必要地传入一个从用户上下文中已知的参数。

如果我没有使用 spring-data 并且我必须实际为控制器编写代码,我会从读取用户组的所有 API 处理程序调用一个方法:

  User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  String group = user.getGroup();

并将其添加到调用方法的 filterBy 条件中。

是否可以将此功能连接到 spring 数据基础架构中,以便为该接口生成的 find...() 方法将“...ByGoup”标准添加到所有方法中,并且传入用于提取此组参数的方法?

换句话说,我能否更改存储库实例以影响所有生成的方法以使用提供的方法提取用户组,将此 ByGroup 过滤器添加到 spring 生成的初始条件方法名称?

是否可以使用 aspectJ 连接一个 pre/post 方法处理程序来执行此操作?

目前没有对此的直接支持。 Spring Data JPA 已经支持在手动查询定义中使用 SpEL 表达式,例如Spring 安全特定功能可用于 JPQL 查询。这显示在 this example 项目中,但需要手动定义查询。

我们目前正在研究一种机制,以提供方法来增强 Spring Data 执行的所有查询。请务必按照 DATACMNS-293 for the fundamental infrastructure as well as DATAJPA-307 了解软删除的示例实施。

对于 DATACMNS-293,我们已经提供了功能分支构建,因此您可以尝试构建自己的 QueryAugmentorAnnotationBasedQueryAugmentor 可能是您要查看的类型。