java-Spring Data Rest中的分页用于嵌套资源
作者:互联网
当访问下面的URL时,我得到分页
/api/userPosts/
{
"_links" : {
"self" : {
"href" : "/api/userPosts{?page,size,sort}",
"templated" : true
},
"next" : {
"href" : api/userPosts?page=1&size=20{&sort}",
"templated" : true
}
},
"_embedded" : {
"userPosts" : [ {
...
但是,当访问以下URL时,Spring Data REST不会分页-
/api/users/4/userPosts
{
"_embedded" : {
"userPosts" : [ {
UserRepository和UserPostRepository都是具有分页功能的JPARepository.结果,第二个URL抛出超出GC的错误,因为返回的结果的行数很大.
@RepositoryRestResource(excerptProjection = UserProjection.class)
public interface UserRepository extends BaseRepository<User, Integer>, UserRepositoryCustom {
}
public interface UserPostRepository extends BaseRepository<UserPost, Long> {
}
@NoRepositoryBean
public interface BaseRepository<T, N extends Serializable> extends JpaRepository<T, N>, QueryDslPredicateExecutor<T> {
}
还有办法对第二个URL进行分页吗?
解决方法:
简短而痛苦的回答:不.绝对不会.
长了更痛苦的答案:是的.通过重写Spring Data,JPA和Hibernate的大部分内容.
问题的核心是,当您请求嵌套实体(是否为集合)时,该嵌套实体不是从存储库查询的.但是是从实体返回的. Spring Data / JPA中没有用于分页的机制
Spring REST中的/ api / users / 4 / userPosts请求基本上是这样的:
User user = userRepository.findOne(4);
return user.userPosts;
因此,检索user.userPosts是对嵌套实体的Eager或Lazy引用,无法分页.
实现此目的的最简单且唯一的解决方案是:
1.创建Spring Data搜索查询:UserPostRepository.findByUserId(Long id,Pagination pa)
2.创建自定义的Spring MVC控制器进行映射
@Get("/api/users/{id}/userPosts")
public Page<UserPost> getUserPostsByUserId(Long id, Pagination pagi) {
return userPostRepository.findByUserId(id, pagi);
>重要!你不能!将user.userPosts注释为嵌套在User实体中,否则请求映射将发生冲突.
>如果要在用户实体JSON中为此路径的导航超链接,则需要
用户实体JSON创建的自定义处理.它没有充分记录,并且所有示例都没有涉及您需要探索的确切用例.
标签:java,spring,spring-data-rest,spring-data 来源: https://codeday.me/bug/20191013/1906327.html