PageHelperはSpringBootの@PostConstructでは有効になりません

1529 ワード

シーン
PageHelperを使用する過程で、データベースに30個のCountryレコードが格納されていると仮定する奇妙な問題が発生しました.次の方法でPageHelperを使用してページングクエリーを行うと、page.sizeは10になります.
PageHelper.startPage(1, 10);
List list = countryMapper.selectAll();
PageInfo page = new PageInfo(list);
assertEquals(10, list.size());

一般的に結果は私たちが望むようになりますが、次のコードをSpringBootに@PostConstructと表記する方法に置くと、クエリの結果は10ではなく30になります.その理由を見てみましょう.
@Component
public class PageHelperProblem {

    @Autowired
    CountryMapper countryMapper;

    @PostConstruct
    public void init() {
        PageHelper.startPage(1, 10);
      List 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
この文章はもしあなたを助けることができるならば、「翎野君」にほめて、あなたの支持に感謝します.