当前使用版本(必填,否则不予处理)
3.4.3
该问题是如何引起的?(确定最新版也有问题再提!!!)
继承ServiceImpl,启动报错
重现步骤(如果有就写完整)
public class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseEntity> extends ServiceImpl<M, T> implements BaseService<T> {
...
}
报错信息
Exception in thread "main" java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.currentModelClass(ServiceImpl.java:88)
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.<init>(ServiceImpl.java:62)
ServiceImpl88行源码如下:
protected Class<T> currentModelClass() {
return (Class<T>) this.getResolvableType().as(ServiceImpl.class).getGeneric(1).getType();
}
Comment From: angcyo
在这里可以找到答案: https://github.com/baomidou/mybatis-plus/issues/3540
Comment From: gdisk
在这里可以找到答案: #3540
@angcyo 谢谢,其实也可以不使用snapshot版本,只需要在子类BaseServiceImpl中重写那两个方法即可,如下:
1. 使用3.4.2的方式:
public class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseEntity> extends ServiceImpl<M, T> implements BaseService<T> {
@Override
protected Class<T> currentMapperClass() {
return (Class<T>) ReflectionKit.getSuperClassGenericType(getClass(), 0);
}
@Override
protected Class<T> currentModelClass() {
return (Class<T>) ReflectionKit.getSuperClassGenericType(getClass(), 1);
}
...
}
- 或者使用最新版3.4.3的方法,但需要修改一个方法,将
getType()改为使用resolve()
public class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseEntity> extends ServiceImpl<M, T> implements BaseService<T> {
@Override
protected Class<T> currentMapperClass() {
return (Class<T>) this.getResolvableType().as(ServiceImpl.class).getGeneric(0).resolve();
}
@Override
protected Class<T> currentModelClass() {
return (Class<T>) this.getResolvableType().as(ServiceImpl.class).getGeneric(1).resolve();
}
...
}