您可以使用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;
}