【问题标题】:Spring boot pagination with http request headers带有 http 请求标头的 Spring Boot 分页
【发布时间】:2020-09-29 19:43:47
【问题描述】:

我想在 Spring Boot 应用程序中实现分页,该应用程序在响应中提供指向下一页和上一页的链接(如果适用)以及当前页面内容。我已经检查了这个https://github.com/javadevjournal/javadevjournal/tree/master/spring/rest-pagination,但是 spring boot 2.2.6 不再支持 hatos mvc 依赖项。 你能帮我一下吗?

【问题讨论】:

标签: java spring-boot pagination


【解决方案1】:

您可以使用AOP 和实现ResponseBodyAdvice 来实现相同的目的。
ResponseBodyAdvice 允许在 Spring MVC 将响应对象写入响应主体之前对其进行自定义。
AOP 将帮助您以通用方式实现这一点,以便它适用于所有适用的控制器方法。

AOP 代码
此代码将在 PageStoreClass 类中设置页面。
创建包含 Page 作为属性/字段的 PageStoreClass

@Aspect
@Configuration
public class PaginationAdvice {

    @Autowired
    private PageStoreClass pageStoreClass;

    @AfterReturning(value = "execution(org.springframework.data.domain.Page com.test.repository.*.*(..))", returning = "page")
    public void afterReturning(JoinPoint joinPoint, Page page) {
        pageStoreClass.setPage(page);
    }
}

ResponseBodyAdvice 实现代码

@RestControllerAdvice
public class ResponsePagination implements ResponseBodyAdvice<Object> {

    @Autowired
    private PageStoreClass pageStoreClass;

    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) {

        Page page = pageStoreClass.getPage();

        final StringBuilder header = new StringBuilder();

        if (page != null) {

            if (!page.isFirst()) {
                String firstPage = ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam("page", 0)
                .replaceQueryParam("size", page.getSize()).build().encode().toUriString();

                header.append(firstPage + "rel= first");
            }

            if (page.hasPrevious()) {
                final String prevPage = ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam("page", pageable.getPageNumber()).replaceQueryParam("size", pageable.getPageSize()).build().encode().toUriString();

                header.append(prevPage + "rel= prev"));
            }

            if (page.hasNext()) {
                final String nextPage = ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam("page", pageable.getPageNumber()).replaceQueryParam("size", pageable.getPageSize()).build().encode().toUriString();

                header.append(nextPage + "rel= next"));
            }

            if (!page.isLast()) {
                final String lastPage = ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam("page", page.getTotalPages() - 1).replaceQueryParam("size", page.getSize()).build().encode().toUriString();

                header.append(lastPage + "rel= last"));
            }

            if (header.length() > 0)
                response.getHeaders().add(HttpHeaders.LINK, header.toString());
        }
        return body;
    }

【讨论】:

    【解决方案2】:

    这对我有用。 Spring HATEOAS – 分页链接 -> https://howtodoinjava.com/spring5/hateoas/pagination-links

    【讨论】:

      猜你喜欢
      • 2020-12-29
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 2016-11-10
      • 2011-09-20
      • 2013-09-04
      相关资源
      最近更新 更多