Error querying database. Cause: java.lang.RuntimeException: 在系統中發現了多個分頁插件,請檢查系統配置! 問題處理

看到這個提示bug,大概就明白是分頁插件進行了2次注入原因導致的。所以分析項目內爲什麼會出現2次分頁相關的對象進行2次注入導致的。全局搜索相關注入配置發現了下面的代碼:

    @PostConstruct
    public void addPageInterceptor() {
        ...... 
        PageInterceptor interceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.putAll(this.pageHelperProperties());
        interceptor.setProperties(properties);
        ......
    }

這段代碼你就會發現進行注入了一次PageInterceptor對象,但是瞭解大概分頁注入方式的同學都知道,mybatis分頁組件依賴jar包內已經進行注入過PageInterceptor對象了,源代碼如下:

public class PageHelperAutoConfiguration implements EnvironmentAware {
    @Autowired
    private List<SqlSessionFactory> sqlSessionFactoryList;
    @Autowired
    private PageHelperProperties pageHelperProperties;
    private RelaxedPropertyResolver resolver;

    public PageHelperAutoConfiguration() {
    }

    public void setEnvironment(Environment environment) {
        this.resolver = new RelaxedPropertyResolver(environment, "pagehelper.");
    }

    @PostConstruct
    public void addPageInterceptor() {
        PageInterceptor interceptor = new PageInterceptor();
        Properties properties = this.pageHelperProperties.getProperties();
        Map<String, Object> subProperties = this.resolver.getSubProperties("");
        Iterator var4 = subProperties.keySet().iterator();
    ....
   }

所以去掉相關的注入即可解決報錯現象。但是可能碰到相關問題的同學並不全是因爲簡單的PageInterceptor注入2次導致的bug出現。小編此次碰到的是同組開發人員是想要添加自定義的mybatis的攔截器:

for (Object sqlSessionObject : this.sqlSessionFactoryList) {
            SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) sqlSessionObject;
//         permissionInterceptor自定義的攔截器
sqlSessionFactory.getConfiguration().addInterceptor(permissionInterceptor);
 }

所以很簡單的修改方式,就是不需要再次注入PageInterceptor,tomcat啓動,spring已經幫助我們進行自動注入相關分頁組件,我們只需要通過自動裝配註解,裝配好SqlsessionFactory,然後注入到相應的Interceptor即可:

@Resource
    private List<SqlSessionFactory> sqlSessionFactoryList;

    @PostConstruct
    public void addPageInterceptor() {
        //數據權限攔截器
        PermissionInterceptor PermissionInterceptor = new PermissionInterceptor();
        for (Object sqlSessionObject : this.sqlSessionFactoryList) {
            SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) sqlSessionObject;
            sqlSessionFactory.getConfiguration().addInterceptor(permissionInterceptor);
        }
    }

歡迎各位評論,一起進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章