Mapper
Mapper copied to clipboard
Cause: java. lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider
springboot 1.5 + mapperV 3.4.0。调用Mapper接口(实际上是MyMapper接口,MyMapper接口继承Mapper接口)的insert时可能会出现上面的错误。大部分正常,但一旦报错就会循环报错。部分代码如下:
public class BaseService <T>{
@Autowired
protected MyMapper<T> mapper;
/**
* 保存一个实体,null的属性也会保存,不会使用数据库默认值
*/
public int insert(T entity) {
return mapper.insert(entity);
}
}
调用处:
WgGuessTask task = new WgGuessTask();
task.setTaskId(taskId);
task.setUserId(userId);
task.setCreateTime(new Date());
task.setUpdateTime(task.getCreateTime());
task.setStatus(0);
task.setIsRecharge(0);
task.setFailLevel(0);
task.setIsShare(0);
taskService.insert(task);
错误信息:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provide
r.base.BaseInsertProvider.dynamicSQL). Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy89.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy92.insert(Unknown Source)
at com.qihe.guess.service.BaseService.insert(BaseService.java:18)
at com.qihe.guess.aync.MessageQueueConsumer.consume(MessageQueueConsumer.java:110)
at com.qihe.guess.aync.MessageQueueConsumer$$FastClassBySpringCGLIB$$be13f4fe.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.interceptor.AsyncExecutionInterceptor$1.call(AsyncExecutionInterceptor.java:115)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseInsertProvider.dynamicSQL). Cause: java.
lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:103)
at org.apache.ibatis.builder.annotation.ProviderSqlSource.getBoundSql(ProviderSqlSource.java:73)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:64)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:40)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:46)
at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:545)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:48)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
... 16 common frames omitted
Caused by: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider
at java.lang.Class.newInstance(Class.java:427)
at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:85)
... 32 common frames omitted
Caused by: java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseInsertProvider.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 33 common frames omitted
我也遇到了, mybatis版本3.4.6. 使用的mapper是mapper-spring-boot-starter-2.0.2.jar包的依赖
@lengmianshi 检查下是不是你的@MapperScan注解用的不是tk.mapper包下的. 我被队友坑了把
初始化出错导致的。。。先看楼上回复,再看这里:https://github.com/abel533/Mapper/wiki/faq
MapperScan
需要使用这个注解 import tk.mybatis.spring.annotation.MapperScan;
刚开始用了
import org.mybatis.spring.annotation.MapperScan;
后面发现前面的mapper是tk的,改成tk的即可,
import tk.mybatis.spring.annotation.MapperScan;
用的就是import tk.mybatis.spring.annotation.MapperScan;,但是还是报错 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseSelectProvider.dynamicSQL). Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy137.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:83)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy138.selectByPrimaryKey(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:197)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy141.selectByPrimaryKey(Unknown Source)
已经解决了,虽然在启动中使用的tk的包,但是在其他代码中不小心又使用了org的包,导致了tk的注解被覆盖了
补充一个会导致这个问题的case:
tk.mybatis.spring.annotation.MapperScan注解指定正确- 自定义的
CommonMapper在mapper.mappers里指定了,并且确认读到了此配置
按照上面的建议,两点都确认了,但问题依然存在。稍微跟进了一下,发现在ClassPathMapperScanner执行doAfterScan时,实际上无视了mapper.mappers指定的mapper类,只处理了默认的Mapper。跟进去发现ClassPathMapperScanner里面传入Config配置到内部的MapperHelper时,并没有任何操作触发自定义的mapper注册,因此相当于注册完全没有生效,确定是一个Bug,由于这个Bug影响会比较大,猜测应该是已知问题。翻翻记录发现在 https://github.com/abel533/Mapper/commit/fefe5df6df82a3dc4dcd866fc6341971b58d0647 这个提交里面修复了这个问题,mapper版本是3.5.3,升级了starter至1.2.4后问题修复。
在https://github.com/abel533/Mapper/tree/master/spring-boot-starter页面中给出的默认建议版本号1.2.3是有此问题的,也并非Mapper 3.x的最新版,Release note的更新也较为滞后,辛苦适时更新一下~
@lengmianshi 检查下是不是你的@MapperScan注解用的不是tk.mapper包下的. 我被队友坑了把
牛批还是牛批,感谢
服务启动时没有任何问题,使用一段时间后,突然就报了这个异常,重启又没有问题了,真尴尬。
我这也是这个原因,感谢!