【10】Spring Boot系列之通用 mapper 改进AOP

【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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值