mybatis-plus 高级特性-批量保存(MybatisPlusException:Error: Cannot execute table Method, ClassGenricType not)-程序员宅基地

技术标签: spring  java  mybatis  技术实战  mybatis-plus  

 背景

项目中有些需要初始化的配置项,希望通过mybatis-plus批量(因为自己比较懒,不想通过循环的方式存储进去[也有点太low])的保存进数据库,但是此时得到的以下的错误

com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Error: Cannot execute table Method, ClassGenricType not found .
	at com.baomidou.mybatisplus.core.toolkit.ExceptionUtils.mpe(ExceptionUtils.java:49)
	at com.baomidou.mybatisplus.core.toolkit.Assert.isTrue(Assert.java:38)
	at com.baomidou.mybatisplus.core.toolkit.Assert.notNull(Assert.java:72)
	at com.baomidou.mybatisplus.extension.toolkit.SqlHelper.table(SqlHelper.java:86)
	at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.sqlStatement(ServiceImpl.java:113)
	at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.saveBatch(ServiceImpl.java:126)
	at com.baomidou.mybatisplus.extension.service.IService.saveBatch(IService.java:69)
	at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:750)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
	at com.aimsphm.nuclear.ext.service.impl.CommonDeviceDetailsServiceExtImpl$$EnhancerBySpringCGLIB$$5fae3a80.saveBatch(<generated>)
	at com.aimsphm.nuclear.core.service.impl.MonitoringServiceImpl.initDefaultConfig(MonitoringServiceImpl.java:214)
	at com.aimsphm.nuclear.core.service.impl.MonitoringServiceImpl.modifyDeviceStatus(MonitoringServiceImpl.java:166)
	at com.aimsphm.nuclear.core.service.impl.MonitoringServiceImpl$$FastClassBySpringCGLIB$$178697ab.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:750)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
	at com.aimsphm.nuclear.core.service.impl.MonitoringServiceImpl$$EnhancerBySpringCGLIB$$9006bdbe.modifyDeviceStatus(<generated>)
	at com.aimsphm.nuclear.core.controller.MonitoringController.modifyDeviceStatus(MonitoringController.java:74)
	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.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:893)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:798)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:663)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.knife4j.spring.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.knife4j.spring.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:90)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

跟着异常栈发现 

该对象在这个位置实例化 

以下是项目中部分类的结构,很显然我要使用的扩展类的父类中是没有泛型的,因此问提出现这个位置

//服务接口
public interface CommonUserService extends IService<CommonUserDO> {

}

//扩展服务接口
public interface CommonUserServiceExt extends CommonUserService {
}

//实现类
public class CommonUserServiceImpl extends ServiceImpl<CommonUserMapper, CommonUserDO> implements CommonUserService {

}

//实现扩展类
@Service
@ConditionalOnProperty(prefix = "spring.config", name = "enableServiceExtImpl", havingValue = "true")
public class CommonUserServiceExtImpl extends CommonUserServiceImpl implements CommonUserServiceExt {
}

 修改如下-确保可执行的service能找到父类的泛型

PS:主要是通过泛型中的实体类,获取到要操作表格的名称

//服务接口
public interface CommonUserService extends IService<CommonUserDO> {

}

//扩展服务接口
public interface CommonUserServiceExt extends CommonUserService {
}

//实现类
public class CommonUserServiceImpl<M extends BaseMapper<T>, T>  extends ServiceImpl<CommonUserMapper, CommonUserDO> implements CommonUserService {

}

//实现扩展类
@Service
@ConditionalOnProperty(prefix = "spring.config", name = "enableServiceExtImpl", havingValue = "true")
public class CommonUserServiceExtImpl extends CommonUserServiceImpl<CommonUserMapper, CommonUserDO> implements CommonUserServiceExt {
}

 

PS :并不是所有的服务都需要扩展服务,如果是直接继承ServiceImpl<M extends BaseMapper<T>, T>,并指定泛型,是可以进行批量操作的

其实日志中已经给出提示,不过此时并不会影响到单个函数的操作[后续有可能MP会修复这个问题(因为可以通过父类的父类泛型获取该实体对象)]

2020-12-16 20:04:46.126 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 3344 ms
2020-12-16 20:04:46.291 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonComponentServiceExtImpl's superclass not ParameterizedType
2020-12-16 20:04:52.237 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonDeviceServiceExtImpl's superclass not ParameterizedType
2020-12-16 20:04:52.425 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonSubSystemServiceExtImpl's superclass not ParameterizedType
2020-12-16 20:04:52.625 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonMeasurePointServiceExtImpl's superclass not ParameterizedType
2020-12-16 20:04:53.396 [main] INFO  org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService
2020-12-16 20:04:53.528 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonBookServiceExtImpl's superclass not ParameterizedType
2020-12-16 20:04:53.588 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonUserServiceExtImpl's superclass not ParameterizedType
2020-12-16 20:04:53.617 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonStoreServiceExtImpl's superclass not ParameterizedType
2020-12-16 20:04:53.740 [main] WARN  com.baomidou.mybatisplus.core.toolkit.ReflectionKit - Warn: CommonStudentServiceExtImpl's superclass not ParameterizedType

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hu10131013/article/details/111300840

智能推荐

全网首发,Python解决某象滑动还原验证码100%还原_python还原验证图片-程序员宅基地

文章浏览阅读1.1k次。与一般的滑动验证码不同,某象的滑动还原验证码是将图像上下两块分割,然后在随机一块往右移动,将两块拼图移动成完整的图像才算成功,事实上,解决这类验证码比普通的验证码还要简单。_python还原验证图片

Win7下多线程中OpenFileDialog和SaveFileDialog失效的解决办法(转载)-程序员宅基地

文章浏览阅读185次。在程序中,通常会使用独立线程来操作OpenFileDialog或者SaveFileDialog控件,但是在某些情况下(Win7系统下)调用 ShowDialog方法并不显示选择路径对话框。此时需要对启动线程的地方进行处理一下即可,方法如下: 方法一 Threadapp=newThread(newParameteriz在程序中,通常会使用独立线程来操作OpenFileDialog或者SaveFile..._win7 openfiledialog

vim常用命令以及配置文件_vim dw命令-程序员宅基地

文章浏览阅读1.7k次,点赞9次,收藏9次。vim常用命令以及配置文件_vim dw命令

python3一键安装脚本_Linux编译安装python3(附一键安装脚本)-程序员宅基地

文章浏览阅读444次。Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7版本,默认的python被系统很多程序所依赖,比如centos下的yum就是python2写的,所以默认版本不要轻易删除,否则会有一些问题,如果需要使用最新的Python3那么我们可以编译安装源码包到独立目录,这和系统默认环境之间是没有任何影响的,python3和python2两个环境并存即可首..._python3一键安装脚本

python串口发送大量数据卡顿问题_py通信串口发送数据太快卡掉应用程序-程序员宅基地

文章浏览阅读1.2k次。我用python写了一个FPGA的自动化验证平台,使用串口自动往fpga输入数据,然后我用的python numpy将数组通过串口发送数据。问题就出现在这,我的数组数据量非常庞大,于是我想出了以下解决方案:1,将大数组切分为小数组,多次调用serial.write,中间用定时器隔开(实际我用的时候用的sleep,停止运行,因为懒得查怎么搞定时器,好像并没什么用,还是会很卡顿,有时间再搞清楚定时器吧)。2,将大数组切分为多个小数组,多次调用serial.wtite,不同的是,中间使用serial.fl_py通信串口发送数据太快卡掉应用程序

Flutter 入门与实战(九),retrofit设计模式_flutter retrofit-程序员宅基地

文章浏览阅读647次。Clip.hardEdge:从名字就知道,这种方式很粗糙,但是裁剪的效率最快;Clip.antiAliasSaveLayer:最为精细的裁剪,但是非常慢,不建议使用;Clip.none:默认值,如果内容区没有超出容器边界的话,不会做任何裁剪。内容超出边界的话需要使用别的裁剪方式防止内容溢出。圆形扁平按钮这里需要提一下, Flutter 2.0以前的扁平按钮是FlatButton,使用起来很简单,但是很多场合不太满足,因此2.0以后引入了 TextButton 替代。TextButton 多了一个._flutter retrofit

随便推点

报错:“不是有效的Win32应用程序”的解决办法-程序员宅基地

文章浏览阅读937次。Win7、Win8下用VS2013编译完的程序,拿到32位WindowsXP虚拟机下运行有时候会报错:解决办法如下:进入工程的属性,修改:再修改:即可转载于:https://www.cnblogs.com/predator-wang/p/4788814.html..._tts speak 不是有效的win32应用程序

_tkinter.TclError: invalid command name “tixComboBox“ 的解决办法_invalid command name ".!toplevel.!labelframe.!comb-程序员宅基地

文章浏览阅读762次。修改为 ttk.Combobox()根据Pycharm的自动导入class tkinter.tix.ComboBox,但根据Mannuals描述这个库应该已经废弃了Deprecated since version 3.6: This Tk extension is unmaintained and should not be used in new code. Use tkinter.ttk instead.所以导入ttk自动补全可知应该为ttk.Combobox()..._invalid command name ".!toplevel.!labelframe.!combobox4

常见电机工作原理-程序员宅基地

文章浏览阅读2k次,点赞3次,收藏16次。参考链接:https://space.bilibili.com/1855672581?spm_id_from=333.788.b_765f7570696e666f.1一、直流有刷电机定子:一边一个定子为极性相反的电磁铁转子:由很多线圈绕成,通电后就是电磁铁换向器:换向器上连接着线圈,电机旋转时可以给不同线圈供电保持旋转电刷:后面有个弹簧顶着,使它保持与换向器紧贴着供电二、无刷直流电机1.介绍无刷电机没有电刷,内部不会产生火花或摩擦噪音,也不需要更换、维护电刷。定子具有绕组和线圈激_电机工作原理

python实现局域网攻击_python实现ARP欺骗(宿舍停网警告)-程序员宅基地

文章浏览阅读523次。arp全称为“地址解析协议”,是根据IP获取对应mac地址的一种协议。主机上也是根据arp缓存表进行内网主机的信息交互的,arp缓存表存放着ip对应mac地址的关系。如果一台主机需要上网,就需要先找到自己的网关ip。由于在以太网中都是用mac地址进行主机的交互的,所以要在arp缓存表中根据ip地址查询对应的mac地址。。找到mac地址后就可以将自己的请求发给网关。网关再代之进行转发。这就是一个主机..._py下线局域网

CSS引入方式_css import url-程序员宅基地

文章浏览阅读770次。CSS(层叠样式表)定义了HTML元素在页面中的样式、布局以及整个页面的布局。CSS遵循W3C规范,实现了跨浏览器的标准化。导入的CSS会被直接导入到HTML或CSS文件中,成为文件的一部分。属性设置为目标链接的CSS文件路径,rel属性设置为。表示链接样式表,type属性设置为。3.1 链接样式(最常用)标签链接外部的CSS文件。直接使用HTML元素的。在CSS文件中直接使用。在HTML文件中需要在。在HTML初始化时,_css import url

Java学习笔记_06_main函数必须用public修饰确保调用权限是最大在任何情况下都可以访问;-程序员宅基地

文章浏览阅读179次。一、继承1、通过extends关键字可以实现类与类的继承格式:class 子类名 extends 父类名{}父类:基类、超类子类:派生类以人类、老师类、学生类举例先创建一个人类public class Person { //私有化成员变量 private String name; private int age; //set/get方法 public vo_main函数必须用public修饰确保调用权限是最大在任何情况下都可以访问;

推荐文章

热门文章

相关标签