当前使用版本(必填,否则不予处理)
3.4.3
该问题是如何引起的?(确定最新版也有问题再提!!!)
SpringBoot版本2.4.5 在ServiceImpl中使用Spring自家的ResolvableType获取泛型时方法返回类型不合适出现错误
protected Class<T> currentMapperClass() {
// 这里我很好奇,currentMapperClass获取的应该是Mapper类(泛型 M)才对呀,怎么还用的泛型 是 T 呢???
return (Class<T>) this.getResolvableType().as(ServiceImpl.class).getGeneric(0).getType();
// 这里getType返回类型并不是Class,而是 TypeVariableImpl,所以出现ClassCastException异常
// 这里可以使用 this.getResolvableType().as(ServiceImpl.class).resolveGeneric(0) 直接解决
}
protected Class<T> currentModelClass() {
return (Class<T>) this.getResolvableType().as(ServiceImpl.class).getGeneric(1).getType();
// 这里和上面的方法一样,报错是出自这个方法调用,而非上面那个,上面那个返回值都是错误的
}
重现步骤(如果有就写完整)
程序启动报错
报错信息
Caused by: java.lang.ClassCastException: class sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to class java.lang.Class (sun.reflect.generics.reflectiveObjects.TypeVariableImpl and java.lang.Class are in module java.base of loader 'bootstrap')
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.currentModelClass(ServiceImpl.java:88) ~[mybatis-plus-extension-3.4.3.jar:3.4.3]
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.<init>(ServiceImpl.java:62) ~[mybatis-plus-extension-3.4.3.jar:3.4.3]
at com.ilxqx.framework.base.service.AbstractService.<init>(AbstractService.java:24) ~[classes/:na]
at com.ilxqx.nj.admin.service.system.UserService.<init>(UserService.java:16) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:212) ~[spring-beans-5.3.6.jar:5.3.6]
... 77 common frames omitted
Comment From: guoqianyou
我也遇到了 你提的好快呀
Comment From: qmdx
请给出一个简单的重现问题 demo 类似 https://gitee.com/baomidou/mybatis-plus-samples
Comment From: guoqianyou
@qmdx https://github.com/guoqianyou/mybatis-problem 这个可以么.
Comment From: refeccd
currentMapperClass 不说还真没看到是 T 类型。。
Comment From: qmdx
解决,请试下快照版本 3.4.4-SNAPSHOT 使用方式 https://baomidou.com/guide/install.html#release
测过后请给予反馈
Comment From: terminux
解决,请试下快照版本
3.4.4-SNAPSHOT使用方式 https://baomidou.com/guide/install.html#release测过后请给予反馈
这个快照版本没问题了,但为什么不把 currentMapperClass 方法的泛型改为 M 呢
Comment From: qmdx
解决,请试下快照版本
3.4.4-SNAPSHOT使用方式 https://baomidou.com/guide/install.html#release测过后请给予反馈
这个快照版本没问题了,但为什么不把
currentMapperClass方法的泛型改为M呢
好的,这边调整下。
Comment From: jptx1234
@qmdx 请问要不要考虑发布一个版本,这个问题还是挺严重的,我认识的产品线很多人都遇到了
Comment From: qmdx
@qmdx 请问要不要考虑发布一个版本,这个问题还是挺严重的,我认识的产品线很多人都遇到了
近期会发布,目前快照可用
Comment From: angcyo
当前使用版本(必填,否则不予处理)
3.4.3
该问题是如何引起的?(确定最新版也有问题再提!!!)
SpringBoot版本2.4.5 在ServiceImpl中使用Spring自家的ResolvableType获取泛型时方法返回类型不合适出现错误
```java protected Class
currentMapperClass() { // 这里我很好奇,currentMapperClass获取的应该是Mapper类(泛型 M)才对呀,怎么还用的泛型 是 T 呢??? return (Class ) this.getResolvableType().as(ServiceImpl.class).getGeneric(0).getType(); // 这里getType返回类型并不是Class,而是 TypeVariableImpl,所以出现ClassCastException异常 // 这里可以使用 this.getResolvableType().as(ServiceImpl.class).resolveGeneric(0) 直接解决 } protected Class
currentModelClass() { return (Class ) this.getResolvableType().as(ServiceImpl.class).getGeneric(1).getType(); // 这里和上面的方法一样,报错是出自这个方法调用,而非上面那个,上面那个返回值都是错误的 } ``` 重现步骤(如果有就写完整)
程序启动报错
报错信息
Caused by: java.lang.ClassCastException: class sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to class java.lang.Class (sun.reflect.generics.reflectiveObjects.TypeVariableImpl and java.lang.Class are in module java.base of loader 'bootstrap') at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.currentModelClass(ServiceImpl.java:88) ~[mybatis-plus-extension-3.4.3.jar:3.4.3] at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.<init>(ServiceImpl.java:62) ~[mybatis-plus-extension-3.4.3.jar:3.4.3] at com.ilxqx.framework.base.service.AbstractService.<init>(AbstractService.java:24) ~[classes/:na] at com.ilxqx.nj.admin.service.system.UserService.<init>(UserService.java:16) ~[classes/:na] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na] at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na] at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:212) ~[spring-beans-5.3.6.jar:5.3.6] ... 77 common frames omitted
sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class +1
Comment From: clay-f
+1
Comment From: qmdx
请使用版本 3.4.3.1 试试