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

博客讲述了在项目启动时遇到通用Mapper无法获取实体类对应表名的错误。问题出在启动类使用了错误的@MapperScan注解。通过将org包的@MapperScan替换为tk包的@MapperScan注解,成功解决了该问题。该问题出现在实现ServletContextListener接口的监听器类中,对注入的业务service接口进行操作时触发。
摘要由CSDN通过智能技术生成

通用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接口时,项目启动则产生上面的报错,特此记录一波
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值