JFinal异常:The Table mapping of model not exists(2)

33号小人物 发布于 2015/09/16 17:03
阅读 769
收藏 0

前文再续:http://www.oschina.net/question/1793377_251436

@JFinal 你好,想跟你请教个问题:

这是在插件初始化之后,运行定时任务时的debug,断点处为

Table table = modelToTableMap.get(modelClass); 

在TableMapping的类文件中,此时两个变量的值如下图所示,返回的结果为Null。

调用上述命令的位置是,在Model类文件中

private Table getTable() {
return TableMapping.me().getTable(getClass());
}

以下是程序继续运行后,通过其他方式调用该方法,程序运行正常。在同样的断点处,各变量的值如下图所示:

调用上述命令的位置是,在Model类文件中:

private List<M> find(Connection conn, String sql, Object... paras) throws Exception {
Config config = getConfig();
Class<? extends Model> modelClass = getClass();
if (config.devMode)
checkTableName(modelClass, sql);
…………
}

private void checkTableName(Class<? extends Model> modelClass, String sql) {
Table table = TableMapping.me().getTable(modelClass);
…………
}

我的问题是:同样的调用,为什么两次getClass()返回的结果会不一样。后续每次getClass()得到的modelClass的id为60,只有第一次getClass()的id不一样。

补充配置页面:

加载中
1
如梦技术
如梦技术

是否有jar包是以其他方式引入进来的,而不是使用maven或者lib目录下的。上次有朋友在JFinal-event中遇到这问题,他的jar是丢在了其他目录。开发模式下,第一次就有这问题,JFinal的自动编译运行一次又好了,重启服务又这样!

0
等烟雨

没配映射

33号小人物
33号小人物
在debug中看到映射Map中是有数据的
0
JFinal
JFinal

    问题已经很明朗了,TableMapping 中的属性 modelToTableMap,是以Model 的 Class 对象为key 建立与Table 对象间的映射,一开始初始化的时候该 Model 的 Class 对象的 id 为 35,所以后续当此 id 值为 60 自然就取不到与之对应的 Table 对象了,最终导致了程序运行不正确。

    可能的原因有两个:

1:程序启动时 Model 的 Class 对象被创建所使用的类加载器与之后 Model 的 Class 对象创建的加载器不是同一个。

2:假定类加载器是同一个,但是第一次与后面被加载的类文件不是同一个,例如,第一次加载的是 CALSS_PATH 下的 bin 目录下的 class 文件,而后续加载的是  WebRoot/WEB-INF/classes 目录下的文件。

    简单一句话总结上面的两点就是:同一个 class 文件使用了不同的类加载器。来自不同目录的两个 class 文件使用同一个加载器。

    当然,还可能有更加复杂的情况:类加载器与 classes 文件都不是同一个。最先要去检查的是看看 eclipse 项目配置中的 Output fold 是否为 WEB-INF/classes :

JFinal
JFinal
回复 @33号小人物 : 贴出详细的相关代码,仅凭猜测无法解决问题
33号小人物
33号小人物
回复 @JFinal : 在我另外一个相类似的项目中,同样的代码却可以正常运行,唯一的区别是,出问题的项目的代码被我拆成了两个项目,但是出问题的项目其他功能都正常,就是这个定时任务出问题。
33号小人物
33号小人物
回复 @JFinal : 我在程序里没有使用ClassLoader,就是直接调用Model子类的对象。通过定时任务第一次调用getClass()时,会获取到一个比插件初始化时,更早的Model对象(根据ID判断)。而当通过调用Controller,再去调用Model对象的时候,获取到的Model对象的ID,就是插件初始化时,Model对象的ID。
JFinal
JFinal
回复 @33号小人物 : 那么上面两个原因的第二个可以排除了,仔细分析一下程序,有什么地方使用过不同的 ClassLoader
33号小人物
33号小人物
配置的截图我已经补充上了。而且,我是第一次调用的时候不成功,以后的每次调用的都没问题。
返回顶部
顶部