PageHelper在SpringBoot的@PostConstruct中不生效


場景

在使用PageHelper的過程中,出現了一個很奇怪的問題,假設在數據庫中存放有30條Country記錄,我們用下面的方法使用PageHelper進行分頁查詢,那么我們希望得到的page.size是10。

PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
PageInfo page = new PageInfo(list);
assertEquals(10, list.size());

一般情況下結果是如我們所願的,但是當下面的代碼放到SpringBoot中標明@PostConstruct的方法下后,查詢結果就是30而不是10,讓我們一起來看看其中的原因。

@Component
public class PageHelperProblem {

    @Autowired
    CountryMapper countryMapper;

    @PostConstruct
    public void init() {
        PageHelper.startPage(1, 10);
	  List<Country> list = countryMapper.selectAll();
	  PageInfo page = new PageInfo(list);
	  assertEquals(10, list.size());
    }
}

原因

debug之后發現,在執行完代碼PageHelper.startPage(1, 10)之后,我們把pageSize和pageNum設置到ThreadLocal中去了,但是在執行下一行代碼之前,理論上應該進入到PageInterceptor攔截器中給sql動態的加上limit條件。但是沒有進去,原因在於Bean的PostConstruct執行的時候,Pagehelper的autoconfigure還沒有初始化,故而攔截器還沒有創建出來,所以導致的結果就是startPage只是把分頁參數設置到了ThreadLocal中去了,但是卻沒有被攔截器攔截,所以導致了分頁失敗,沒有達到預期的分頁效果。

 

參考文章:

https://www.liangzl.com/get-article-detail-132917.html

https://github.com/pagehelper/pagehelper-spring-boot/issues/38

 

本篇文章如有幫助到您,請給「翎野君」點個贊,感謝您的支持。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM