在Spring Data Rest 2.1中分页子资源

7

我使用Spring Data Rest 2.1.1 Release默认配置,考虑以下资源:

GET /communities/MyCommunity

{
    "creationDate": "2014-07-16T06:22:37.153+0000",
    "name": "GroupeSEB",
    "_links": {
        "self": {
            "href": "http://localhost:8080/api/communities/GroupeSEB"
        },
        "posts": {
            "href": "http://localhost:8080/api/communities/GroupeSEB/posts"
        }
    }
}

当我获得“posts”子资源时:
GET /communities/MyCommunity/posts

{
    "_embedded": {
        "posts": [
            {
                "creationDate": "2014-07-09T13:09:14.535+0000",
                "id": "53bd3efae4b012818368c549",
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/posts/53bd3efae4b012818368c549"
                    } 
                }
            }
        ]
    }
}

没有启用分页。由于我的父资源可以聚合大量帖子(其子资源),我该如何为每个子资源启用分页?
2个回答

3
答案非常简单:你无法做到。以下是原因:
关联资源代表主要实体与一个或多个其他实体之间的关联。因此,要呈现这些资源,我们需要查找主要实体并访问属性。这意味着,没有使用存储库和无法应用分页的地方,因为整个机制与存储无关。我们操作实体实例以加载关联的方式高度依赖于具体存储所采用的机制。
因此,如果您的领域模型中已经存在对象关联,则完全受限于存储处理关联的方式。因此,即使应用了分页,您也必须首先读取所有相关对象以获取其ids。
作为解决方法,您可以回退到仅使用ids,并在该路径上手动公开资源,该资源将使用与关联实体的存储库上的专用查询方法。

面对相同的问题,在我的情况下,由于子资源导致大结果集引起GC错误,这使问题加剧。我认为我也应该将这些资源的RestExpose设置为false,并在存储库中手动提供一个可分页的资源,通过ResourceProcessor绑定。相关链接- http://stackoverflow.com/questions/26451920/pagination-in-spring-data-rest-for-nested-resources - fortm

3
Oliver所给的答案并不完全正确。
在EAGER嵌套实体(集合)上,没有使用存储库。但是,在LAZY嵌套实体(集合)上存储库使用。默认情况下,@One2Many是LAZY的。因此,只有在会话中访问嵌套实体时,嵌套实体才会被填充。Spring Data REST列出父实体时,从未访问过嵌套实体。当通过嵌套实体访问URL(例如/communities/GroupeSEB/posts)访问懒惰嵌套实体时,将访问嵌套对象,并且作为这个嵌套对象不是对象实例而是对象的LazyProxy,它会导致从repo检索。好吧,可以从Repo层缓存而不是repo中检索嵌套对象,但我认为您可以禁止嵌套实体/对象的缓存。
因此,如果有一种方法可以传递/检索LazyProxy实现的分页信息,那么这可能有效。
附言:我知道他们的经验,因为我在@One2Many和@Many2One之间进行了双向导航,并为了防止在列出父对象时发生N + 1,我设置了@ManyToOne(fetch = FetchType.LAZY),然后使用@NamedEntityGraph覆盖了repo接口中的相关findbyId(),强制将嵌套实体在使用@NamedEntityGraph检索时设置为EAGER。这不直接适用于此问题,但确实证明了在Spring Data REST中,检索嵌套实体是可控的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接