【问题标题】:Spring Data REST Override findBy* MethodSpring Data REST 覆盖 findBy* 方法
【发布时间】:2014-06-05 22:02:11
【问题描述】:

我正在使用带有 spring-data-jpa 1.5.0.RELEASE 的 spring-data-rest-webmvc 2.0.0.RELEASE。

我有一个 RoomRepository、RoomRepositoryCustom 和 RoomRepositoryImpl 类。

我正在尝试重写 findBy* 方法,以便我可以提供自定义逻辑来完成 @PostFilter 的工作,但返回分页结果。

我最初在 RoomRespository 中有这个:

@PostFilter("hasPermission(filterObject, '" + FIND + "')")
@RestResource(rel = "byName", path = "byName")
public List<Room> findByName(@Param("name") String name);

效果很好,但是由于@PostFilter 的限制,我必须返回一个列表,而不能返回一个页面。

我想像这样取消@PostFilter:

@RestResource(rel = "byName", path = "byName")
public Page<Room> findByName(@Param("name") String name, Pageable p);

但我仍然需要按经过身份验证的用户的主体过滤我的结果。 (我希望在我的自定义方法中这样做)

所以我想我可以通过在 RoomRespositoryImpl 中提供一个实现来覆盖 findByName,但这似乎无法正常工作。如果我尝试覆盖 findByName,则 Spring Data REST 不再选择该方法,并且永远不会为 rooms/search/byName?name="test" 注册端点。

我还尝试使用@Query 为查找器定义自定义查询。它可以工作,但我不相信它会为我的目的工作,因为我需要使用经过身份验证的用户的主体作为查询参数。

总而言之:如何最好地使用 Spring Data REST 实现 /rooms/search/byName?name="test" 端点,该端点返回名称包含参数的房间页面,但也由我自己过滤基于在单独的表中查找当前经过身份验证的用户的权限的自定义逻辑?

有没有办法在 /rooms/search/* 下添加自定义链接?

【问题讨论】:

    标签: java spring spring-mvc spring-data spring-data-rest


    【解决方案1】:

    简而言之:目前(2.0/2.1 版)不支持此功能。就安全性而言,分页是一个相当复杂的野兽,因为@PostFilterapproach 并不能真正起作用,因为如果您在加载页面后从页面中过滤项目,则会创建无效结果。

    此问题的正确解决方案需要将安全约束合并到执行的查询中。我们在 Spring Data Commons 中有一个 ticket 来跟踪此所需的一般基础设施,还有一个在某种程度上相关的 one 在 Spring Data JPA 中支持软删除,您可能想跟踪该主题的进展.

    【讨论】:

    • 我同意过滤分页结果似乎是一项艰巨的任务。有没有办法为 findBy* 类型方法提供自定义实现,并且仍然让 SDR 将它放在实体根 url 的 /search 下?我可以使用查询进行分页和过滤,但我想保持一致性并以相同的方式公开给定实体的搜索方法。
    • 不能同时进行。编写自定义实现是一种选择,但由于我们无法判断您的自定义实现的幂等性,因此我们不会自动为其公开搜索资源。但是您应该能够手动编写一个控制器,将其混合到同一个 URI 空间中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2019-07-23
    • 2019-09-13
    • 2018-05-28
    • 2016-08-14
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多