【问题标题】:Use case for Pagination of Embedded resources嵌入式资源分页用例
【发布时间】:2014-12-18 05:02:07
【问题描述】:

有一个用例我正在与 SDR 作斗争,如下所示 -

有用户表和 RefSecQuestion 表

User -> ManyTOOne -> RefSecQuestion , RefSecQuestion -> OneToMany -> User

有 User 表和 UserFriends 表

User -> OneToMany UserFriends , UserFriends -> ManyToOne -> User

有一个要求,当我去 /users/{id}/userFriends 时, 然后默认显示 UserProjection 中的 firstname , lastname 等

因此,我在 UserRepository 中启用了 excerptProjection,它工作正常。 我希望这里有大约 100 个结果,所以如果这个结果没有分页就可以了。

但是,现在由于 RefSecQuestion 也与 User 相关,所以当我去的时候会发生什么 /refSecQuestions -> 此页面挂起,因为它试图用 UserProjection 替换用户链接。对于大多数用户而言,RefSecQuestion 表偏向于一个问题,因此由于分页丢失而导致分页。

因为我不能在这里选择单向性,因为两个 url 都需要,即

/users/{id}/userFriends
/refSecQuestions/users  

我找到的最接近的答案是选择单向性,即我在 RefSEcQuestion 中为用户将 Rest Export 设置为 false

【问题讨论】:

  • 你已经知道答案了:stackoverflow.com/questions/24775583/…
  • @zeroflagL,是的,我看到了 Oliver 的回应,但无法按照他所说的执行。你能在这里提供一些指导吗?我理解为 ExposeIdOnly 配置 SDR,此后不明白如何手动保持 URL 相同
  • 我不太确定,但我认为“手动公开资源”是指编写 Spring MVC 控制器。
  • 我正在使用 Spring Seccurity 我对其进行了配置,以便所有 /users/{id}/* URL 仅向使用 {id} 登录的用户公开。现在,由于这个分页不是开箱即用的,而且我现在要分别公开 /profile ,/userLanguages ,因此设计弹簧安全策略更加困难,因为 id 数量增加了..因此正在寻找使用 Spring Data 的解决方案JPA 技巧可以使用 Spring MVC 获得相同的结果
  • 我也看过这里,似乎这里建议的是创建一个自定义查找方法,但是 URL 然后会发生变化,因为其中将包含 /search stackoverflow.com/questions/21469538/…

标签: spring-data spring-data-rest


【解决方案1】:

我终于能够得到我想要的结果,并在这里为所有 SDR 用户发帖。 我想在这个 URL 中进行分页 - 其中用户 -> 一对多 -> UserLanguages

/users/{id}/userLanguages

现在使用默认 SDR 配置,嵌入式资源不会被分页,因此我必须手动公开它们,解决方法如下,仍然需要非常少的代码行 -

@RestController
public class MainController {

    @RequestMapping(value = "/users/{id}/userLanguages", method = RequestMethod.GET)
    @PreAuthorize("permitAll")
    public ModelAndView findUserLanguages(@PathVariable Integer id) {
        ModelAndView model = new ModelAndView("forward:/userLanguages/search/findByUserId?userId=" + id);
        return model;
    }

然后,在 UserLangRepository 中

public interface UserLanguageRepository extends BaseRepository<UserLanguage, Integer> {

    Page<UserLanguage> findByUserId(@Param("userId") Integer userId, Pageable pageable);
}

这里的 name findByUserId 遵循 Spring Data Query Derivation 规则,其中 UserLanguage 中有 user 列,User 中有 id 列。 然后下面的 URL 被分页并有其他选项以及排序、大小等。

http://localhost:8585/MYAPP/users/3/userLanguages

但是存在一个问题,即下一个和上一个链接指向转发链接..

【讨论】:

  • 这对我有用,如果可能的话我想找到另一个解决方案,但现在它解决了这个问题,谢谢!
猜你喜欢
  • 2011-10-30
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多