在 【9】Spring Boot系列之通用 mapper 基础上作以下改进:
(1)定义注解:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PagingQuery {
String pageNumParam() default "pageNum";//页号的参数名
String pageSizeParam() default "pageSize";//每页行数的参数名
}
(2)定义切面
@Aspect
@Component
public class PagingAop {
@Around("@annotation(pagingQuery)")
public Object pagingQuery(ProceedingJoinPoint joinPoint, PagingQuery pagingQuery) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Class<?> returnType = signature.getMethod().getReturnType(); //返回类型
/**
* 返回类型returnType 必须为 Object,不能为List;
* 否则报错:com.github.pagehelper.PageInfo cannot be cast to java.util.List
* 当(3)中的 findAllUser 返回方法为 List<UserModel> 时,不会执行分页操作
*/
if(returnType == Object.class){
String pageNumParam = pagingQuery.pageNumParam();
String pageSizeParam = pagingQuery.pageSizeParam();
//获取request,从中获取分页参数
ServletRequestAttributes currentRequestAttributes =
(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = currentRequestAttributes.getRequest();
String pageNum = request.getParameter(pageNumParam);
String pageSize = request.getParameter(pageSizeParam);
if (StringUtils.isNotBlank(pageNum) && StringUtils.isNotBlank(pageSize) ) {
try {
PageHelper.startPage(Integer.valueOf(pageNum), Integer.valueOf(pageSize));
Object result = joinPoint.proceed();
// 建议自己实现返回类型,官方自带的返回数据太冗余了
return new PageInfo<>((List<?>) result);
} finally {// 保证线程变量被清除
if (PageHelper.getLocalPage() != null){
PageHelper.clearPage();
}
}
}
}
return joinPoint.proceed();
}
}
(3)Controller 使用:
//PagingQuery:当前端调用时传的参数名跟默认不一致时需指定参数名
@PagingQuery(pageNumParam = "page", pageSizeParam = "size")
@GetMapping("/all")
@ResponseBody
public Object findAllUser() {
List<UserModel> list = userService.findAllUser();
return list;
}
参考:
https://www.jianshu.com/p/61334f4a45d2
https://www.2cto.com/kf/201801/716420.html