在项目中配置PageHelper插件时遇到类型转换异常
PageHelper是一种常用的分页工具,按照常规方法在mybatis的配置文件中整合它:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--全局环境参数--> <settings> ... </settings> <!--插件配置--> <plugins> <!--支持PageHelper插件--> <plugin interceptor="com.github.pagehelper.PageHelper"> ... </plugin> </plugins> </configuration>
在启动服务的时候,却抛出如下异常:
Cause: java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor
看字面意思是类型转换异常,PageHelper不能转换成org.apache.ibatis.plugin.Interceptor,于是点进PageHelper的源码
/** * Mybatis - 通用分页拦截器<br/> * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper * * @author liuzh/abel533/isea533 * @version 5.0.0 */ public class PageHelper extends PageMethod implements Dialect { ... }
确实没有实现Interceptor接口,有丶谜,因为以前的项目也是这么配置的,为什么没出这种问题?
找到老项目点进PageHelper源码:
/** * Mybatis - 通用分页拦截器 * * @author liuzh/abel533/isea533 * @version 3.3.0 * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper */ @SuppressWarnings("rawtypes") @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})) public class PageHelper implements Interceptor { ... }
原因找到了:
PageHelper3、4版本实现了Interceptor接口,PageHelper5不再实现。
那么问题来了,如果使用PageHelper5版本,怎么在mybatis中继承这个插件?从PageHelper所在的com.github.pagehelper包中,发现了一个叫PageInterceptor的类,名字有丶像我们要找的东西,点进源码一看,果然实现了Interceptor接口。
于是我们尝试将这个类放入mybatis的配置文件中,删除不存在的属性,启动服务正常。
结论:使用PageHelper版本3、4时,在mybatis配置文件中用PageHelper类集成,使用PageHelper版本5时,在mybatis配置文件中使用PageInterceptor类集成。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--全局环境参数--> <settings> ... </settings> <!--插件配置--> <plugins> <!--支持PageHelper插件--> <plugin interceptor="com.github.pagehelper.PageInterceptor"> </plugin> </plugins> </configuration>