- 先说我这个服务的情况,服务里有两个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;
}
}