Spring Data REST覆盖findBy *方法

时间:2014-04-21 19:12:08

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

我正在使用spring-data-rest-webmvc 2.0.0.RELEASE w / spring-data-jpa 1.5.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的限制,我必须返回一个List并且不能返回一个Page。

我想像这样取消@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为finder定义自定义查询。它有效,但我认为它不适用于我的目的,因为我需要使用经过身份验证的用户的主体作为查询参数。

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

有没有办法在/ rooms / search / *?

下添加自定义链接

1 个答案:

答案 0 :(得分:2)

简而言之:目前(版本2.0 / 2.1)不受支持。在安全性方面,分页是一个非常复杂的事情,因为@PostFilter方法确实无法正常工作,因为如果您在页面上过滤了项目,则会产生无效结果加载。

此问题的正确解决方案要求将安全约束合并到执行的查询中。我们在Spring Data Commons中有一个ticket来跟踪这需要的一般基础结构,以及在Spring Data JPA中对软删除的支持的某种方式one,你可能想跟踪它该主题的进展。