当前使用版本(必填,否则不予处理)
3.5.5
该问题是如何引起的?(确定最新版也有问题再提!!!)
如果采用new ServiceImpl()类初始化时GenericTypeUtils.resolveTypeArguments(getClass(), ServiceImpl.class);为null。
为什么我是new ServiceImpl()而不是继承,为了剔除一些默认方法,给团队做定制规范使用。
public abstract class BaseService<M extends BaseMapper<T>, T> {
@Autowired
protected M baseMapper;
private ServiceImpl<M, T> serviceImpl = new ServiceImpl<>();
@SuppressWarnings("unchecked")
protected Class<T> entityClass = (Class<T>) ClassUtil.getTypeArgument(getClass(), 1);
@PostConstruct
private void init() {
ReflectUtil.setFieldValue(serviceImpl, "baseMapper", baseMapper);
ReflectUtil.setFieldValue(serviceImpl, "entityClass", entityClass);
ReflectUtil.setFieldValue(serviceImpl, "mapperClass", (Class<T>) ClassUtil.getTypeArgument(getClass(), 0));
}
}
报错信息
Caused by: java.lang.NullPointerException: null
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.currentModelClass(ServiceImpl.java:129) ~[mybatis-plus-extension-3.5.5.jar:3.5.5]
at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.<init>(ServiceImpl.java:76) ~[mybatis-plus-extension-3.5.5.jar:3.5.5]
at ai.yue.library.data.mybatis.service.BaseService.<init>(BaseService.java:45) ~[classes/:na]
Comment From: Jasonyou-boy
泛型的类型是从class文件分析出来的,问题出在GenericTypeUtils.resolveTypeArguments(getClass(), ServiceImpl.class)中的getClass()
在继承的时候获得的是继承者的class信息,直接new ServiceImpl时getClass()获得的是它本身 ,它本身class中泛型参数是M,T。
直接new的情况
继承后的情况
返回为空后currentModelClass()访问了该数组
Comment From: nieqiurong
本身ServiceImpl是要设计成abstract的,并不支持你这种写法.
Comment From: yl-yue
感谢回复,我已去除了套娃封装,改用直接继承ServiceImpl方式,在文档中写明了规范方式