在项目中配置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>
原文地址:https://www.cnblogs.com/dubhlinn/p/10932261.html