让我提供一些背景知识来说明这个问题。随着时间的流逝,我被分配处理的应用程序失去了作为完整应用程序进行构建和部署的能力。我的意思是说,以前的开发人员在其本地IDE中编译了代码,并删除了单个类文件,而不是构建适当的JAR和WAR以部署到tomcat。因此,我受命清理项目,使其再次成为标准的可部署应用程序。因此,归纳起来,重要的部分是,该应用程序以工作格式存在于Windows tomcat环境中,并且很长时间以来还没有进行过清晰的部署,我的目标是使该应用程序可以通过jenkins CI服务器进行构建和部署。在Linux服务器上运行的tomcat实例。现在解决问题。我在一个应用程序模块中收到以下toplink异常。
Local Exception Stack:
Exception [TOPLINK-6007] (OracleAS TopLink - 10g (9.0.4) (Build 031126)): oracle.toplink.exceptions.QueryException
Exception Description: Missing descriptor for [class edu.cornell.finsys.datamodel.AccountDTO].
Query: ReadObjectQuery(edu.cornell.finsys.datamodel.AccountDTO)
我已经验证了tomcat已加载toplink映射文件,并且AccountDTO已映射到该文件中。为了再次确认,我已经将映射文件移出了,在加载时出现了完全不同的错误。我知道文件映射是正确的,因为它在旧服务器上可以正常工作。我不知道还有什么可能导致toplink异常。
有关更多信息,我使用的是tomcat版本6.0.37,Java版本1.6.0_45,toplink版本9.0.4.031126
有任何想法吗?
最佳答案
可能就是这样;来自Metalink:
原因:
这是在第一次使用该应用程序的类加载器部署该应用程序时加载sessions.xml文件,然后在重新部署该应用程序并创建新的XMLContext时不重新加载会话的问题。这导致我们尝试使用已使用与当前应用程序不同的类加载器加载的会话。
可能的解决方案:
当TopLink是主类路径的一部分(例如,Applib目录而不是存储在ear文件中)时,会发生此问题。发生这种情况时,静态SessionManager在第二次及以后部署应用程序时很难找到描述符。基本上,描述符是按类索引的。重新部署应用程序后,将卸载用于索引的类,并显示这些类的新版本。这将导致“找不到描述符”异常。
潜在的解决方法
将toplink.jar文件放在耳朵里。
编写一些代码以在toplink应用程序被删除时手动清理。
对于某些体系结构,他们可能能够使用版本sessionManager.getSession()来刷新会话。
解决方法3是最好的,也是非常可行的。会议必须懒惰
从SessionManager获得并保存在应用程序代码中
变量。重新启动应用程序后,其在TopLink上的句柄
会话将为空。然后可以从
SesssionManager使用getSession(XMLLoader xmlLoader,String
sessionName,ClassLoader对象,ClassLoader,布尔值
shouldLoginSession,boolean shouldRefreshSession)API,
shouldRefreshSession设置为true。这样可以确保旧
会话(如果有)被注销并从SessionManager中删除
在创建一个新的之前。
有任何变通办法有帮助吗?