【国产化踩坑】pagehelper插件 报错 NullPointerException

  • 先说我这个服务的情况,服务里有两个spring容器,所以会有很多bean重复注入的问题

项目改为war包部署 启动后,发现某些接口不好使了,然后观察了一下这些接口,好像都是有关于分页的接口,不分页的接口就好使。
然后去看报错的日志
报错信息长这样

### Error querying database.  Cause: java.lang.NullPointerException
### The error may exist in file 
### The error may involve 
### The error occurred while handling results
### SQL: ***
### Cause: java.lang.NullPointerException
	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.5.4.jar:3.5.4]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) ~[mybatis-3.5.4.jar:3.5.4]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.4.jar:3.5.4]
	at sun.reflect.GeneratedMethodAccessor1381.invoke(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_361]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_361]
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ~[mybatis-spring-2.0.4.jar:2.0.4]
	... 107 more
Caused by: java.lang.NullPointerException
	at com.github.pagehelper.dialect.AbstractHelperDialect.afterCount(AbstractHelperDialect.java:88) ~[pagehelper-5.3.1.jar:?]
	at com.github.pagehelper.PageHelper.afterCount(PageHelper.java:86) ~[pagehelper-5.3.1.jar:?]
	at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:123) ~[pagehelper-5.3.1.jar:?]
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.4.jar:3.5.4]
	at com.sun.proxy.$Proxy2316.query(Unknown Source) ~[?:?]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.4.jar:3.5.4]
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) ~[mybatis-3.5.4.jar:3.5.4]
	at sun.reflect.GeneratedMethodAccessor1381.invoke(Unknown Source) ~[?:?]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_361]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_361]
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ~[mybatis-spring-2.0.4.jar:2.0.4]
	... 107 more

其实这个报错就是因为项目里有多个分页拦截器的事

找到报错的那行代码以后发现是pagehelper 里的 getLocalPage(); 这个方法取出来的page对象为null,debug后发现分页的方法调用了两次,
第一次调用完以后会clear page对象
第二次调用时 page就为null了,导致空指针
猜想是因为存在两个spring容器,一个是当前服务的容器,一个是依赖的子容器
这两个容器都会走一遍 PageHelperAutoConfiguration (pageHelper的自动配置)
导致存在两个分页插件,所以分页方法走了两遍,第一次走完,page会被清,所以第二次就报了空指针!
这里手动配置一下分页插件,把springboot里的pageHelper自动配置过滤掉就不报错了,分页也好使了
过滤的配置在@SpringBootApplication注解后面加了个参数exclude

@Configuration
public class PageHelperConfig {

    @Value("${pagehelper.helperDialect}")
    private String dialect;

    @Bean
    public PageInterceptor pageInterceptor() {
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        // 这里可以设置PageHelper相关参数,例如支持的数据库类型
        properties.setProperty("helperDialect", dialect);
        pageInterceptor.setProperties(properties);
        return pageInterceptor;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值