今天引入 PageHelper
插件时,启动报这个异常。找了好多文章都是说以下三个因素,我再添一个自己的情况:
PageHelper.jar
版本与 MyBatis
版本不兼容,将 PageHelper
版本调高就行。<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelper-spring-boot-starterartifactId>
<version>1.2.10version>
dependency>
就可以直接使用,因为 spring
会自动配置分页插件,而如果引用的是:
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>4.1.6version>
dependency>
则还需要在启动类中加入分页插件的手动配置:
@Bean
PageHelper pageHelper(){
//分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("returnPageInfo", "check");
properties.setProperty("params", "count=countSql");
pageHelper.setProperties(properties);
//添加插件
new SqlSessionFactoryBean().setPlugins(new Interceptor[]{pageHelper});
return pageHelper;
}
pagehelper
版本不同,所需的配置类也不一样。pagehelper 5.0.0
以下版本。使用的是这个类 Pagehelper
,我们在项目中可以这样写: @Bean(name = "pageHelper")
public pageHelper pageHelper(){
pageHelper pageHelper = new pageHelper();
Properties properties = new Properties();
/**默认false,设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用*/
properties.setProperty("offsetAsPageNum","true");
/**默认false,设置为true时,使用RowBounds分页会进行count查询 */
properties.setProperty("rowBoundsWithCount","true");
/** 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 */
properties.setProperty("reasonable","true");
/** always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page */
properties.setProperty("returnPageInfo","check");
/** 支持通过Mapper接口参数来传递分页参数 */
properties.setProperty("supportMethodsArguments","false");
/** 配置数据库的方言 */
properties.setProperty("dialect","oracle");
pageHelper.setProperties(properties);
return pageHelper;
}
5.0.0以上的版本则使用的是 PageInterceptor
,就需要改成下面这样:
@Bean(name = "pageHelper")
public PageInterceptor pageHelper(){
PageInterceptor pageHelper = new PageInterceptor();
Properties properties = new Properties();
/**默认false,设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用*/
properties.setProperty("offsetAsPageNum","true");
/**默认false,设置为true时,使用RowBounds分页会进行count查询 */
properties.setProperty("rowBoundsWithCount","true");
/** 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 */
properties.setProperty("reasonable","true");
/** always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page */
properties.setProperty("returnPageInfo","check");
/** 支持通过Mapper接口参数来传递分页参数 */
properties.setProperty("supportMethodsArguments","false");
/** 配置数据库的方言 */
properties.setProperty("helperDialect","oracle");
pageHelper.setProperties(properties);
return pageHelper;
}
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelperartifactId>
<version>4.1.6version>
dependency>
而 B 模块使用的是:
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelper-spring-boot-starterartifactId>
<version>1.2.10version>
dependency>
A、B 两个模块分别能独立运行,都是已开发完成的产品。但现在要求我将 A 模块运用到B模块上,即 B 依赖 A,这时就报了这个异常。B 明明是自动配置,为什么会找不到 PageInterceptor
,B 单独能正常运行,代表配置正确。为什么依赖 A 后就找不到 PageInterceptor
了。最后打断点发现 B 启动的时候,spring
使用的是 A 中的 PageHelper
。用 MavenHelper
分析下依赖关系,果然报冲突。在 MavenHelper
中指定依赖上右键可排除该依赖。或者手动在 B 模块的 pom
文件中 A 模块配置
标签内加入:
<exclusion>
<artifactId>pagehelperartifactId>
<groupId>com.github.pagehelpergroupId>
exclusion>
当然,最好的办法是删除其中一个依赖,全部使用同一种方式。