当前使用版本(必填,否则不予处理)

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 试试