Bug描述
if (Objects.isNull(cond)) {
return Pagination.of(Collections.emptyList(),PageHelper.startPage(1,10));
}
我们在判断无需从数据库取数时,使用了PageHelper.startPage()
去构造了空页对象,然后引发了一些明明无需分页的查询,却意外被分页的问题。
Bug原因
PageHelper.startPage()
使用后存放在ThreadLocal中没有被PageInterceptor拦截到,并正常消费,分页参数被保存在线程中,当这个线程被再次调用时,就触发了分页。
以下是相应的源码
public abstract class PageMethod {
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal();
protected static boolean DEFAULT_COUNT = true;
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
public static <T> Page<T> getLocalPage() {
return (Page)LOCAL_PAGE.get();
}
public static void clearPage() {
LOCAL_PAGE.remove();
}
......
}
PageHelper是继承自上述PageMethod的。
public class PageHelper extends PageMethod implements Dialect, BoundSqlInterceptor.Chain {
......
}