通用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接口时,项目启动则产生上面的报错,特此记录一波