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

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。 MyBatis-Plus new ServiceImpl()会抛出null异常 直接new的情况 MyBatis-Plus new ServiceImpl()会抛出null异常 继承后的情况 MyBatis-Plus new ServiceImpl()会抛出null异常 MyBatis-Plus new ServiceImpl()会抛出null异常 返回为空后currentModelClass()访问了该数组

Comment From: nieqiurong

本身ServiceImpl是要设计成abstract的,并不支持你这种写法.

Comment From: yl-yue

感谢回复,我已去除了套娃封装,改用直接继承ServiceImpl方式,在文档中写明了规范方式