gpt4 book ai didi

java - Spring Data REST 重写 findBy* 方法

转载 作者:行者123 更新时间:2023-11-30 09:09:04 26 4
gpt4 key购买 nike

我正在使用带有 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);

但我仍然需要通过经过身份验证的用户的委托(delegate)人来过滤我的结果。 (我希望在我的自定义方法中这样做)

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

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

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

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

最佳答案

简而言之:目前(版本 2.0/2.1)不支持此功能。当涉及到安全性时,分页是一个相当复杂的野兽,因为 @PostFilter 方法实际上不起作用,因为如果您在页面被过滤后从页面中过滤项目,您会创建无效的结果已加载。

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

关于java - Spring Data REST 重写 findBy* 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23204181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com