通用mapper:无法获取实体类XXXXXX对应的表名!

错误截图:

在这里插入图片描述
进入报错方法:报错的因为获取到entityTable对象为空

public static EntityTable getEntityTable(Class<?> entityClass) {
        EntityTable entityTable = (EntityTable)entityTableMap.get(entityClass);
        if (entityTable == null) {
            throw new MapperException("无法获取实体类" + entityClass.getCanonicalName() + "对应的表名!");
        } else {
            return entityTable;
        }
    }

为空的原因则是因为:entityTableMap 中没有数据,而entityTableMap 是初始化的时候就会加载的

public static synchronized void initEntityNameMap(Class<?> entityClass, Config config) {
        if (entityTableMap.get(entityClass) == null) {
            Style style = config.getStyle();
            if (entityClass.isAnnotationPresent(NameStyle.class)) {
                NameStyle nameStyle = (NameStyle)entityClass.getAnnotation(NameStyle.class);
                style = nameStyle.value();
            }

            EntityTable entityTable = null;
            Table fields;
            if (entityClass.isAnnotationPresent(Table.class)) {
                fields = (Table)entityClass.getAnnotation(Table.class);
                if (!fields.name().equals("")) {
                    entityTable = new EntityTable(entityClass);
                    entityTable.setTable(fields);
                }
            }

            if (entityTable == null) {
                entityTable = new EntityTable(entityClass);
                entityTable.setName(StringUtil.convertByStyle(entityClass.getSimpleName(), style));
            }

            entityTable.setEntityClassColumns(new LinkedHashSet());
            entityTable.setEntityClassPKColumns(new LinkedHashSet());
            fields = null;
            List fields;
            if (config.isEnableMethodAnnotation()) {
                fields = FieldHelper.getAll(entityClass);
            } else {
                fields = FieldHelper.getFields(entityClass);
            }

            Iterator var5 = fields.iterator();

            while(true) {
                EntityField field;
                do {
                    if (!var5.hasNext()) {
                        if (entityTable.getEntityClassPKColumns().size() == 0) {
                            entityTable.setEntityClassPKColumns(entityTable.getEntityClassColumns());
                        }

                        entityTable.initPropertyMap();
                        entityTableMap.put(entityClass, entityTable);
                        return;
                    }

                    field = (EntityField)var5.next();
                } while(config.isUseSimpleType() && !SimpleTypeUtil.isSimpleType(field.getJavaType()));

                processField(entityTable, style, field);
            }
        }
    }

所以问题就出在了项目加载时,经搜索引擎找到解决的方法是:

  • 我的启动类用了org包的@MapperScan注解去扫描,将其替换成tk包的@MapperScan注解即可解决
    在这里插入图片描述

我出现该bug场景是在实现ServletContextListener接口写的一个项目监听器类里,需要启动时候去调用某个方法;

在注入业务service接口时,项目启动则产生上面的报错,特此记录一波
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐