我编写了一个自定义类加载器,以便能够为更新过程的每个步骤动态加载域模型。在更新的每个步骤中都会创建一个新线程,以确保不仅 contextClassloader 而且当前的类加载器也指向我自己的类加载器。
这听起来有点复杂,但效果很好。
最新的域模型作为静态依赖项添加到项目中,所有以前的域模型作为 jar 添加到资源文件夹中。自定义类加载器从这些 jar 文件加载域类。
所有域类和 eclipselink 类均由我的类加载器加载。但是我仍然遇到以下异常,我不太明白,为什么?
Exception [EclipseLink-59] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The instance variable [hospitalization] is not defined in the domain class [example.role.Patient], or it is not accessible.
Internal Exception: java.lang.NoSuchFieldException: hospitalization
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[hospitalization-->Patient.hospitalization]
Descriptor: RelationalDescriptor(example.role.Patient --> [DatabaseTable(Role), DatabaseTable(Patient)])
域类由我的类加载器加载,并且没有缺少的hospitalization字段。没关系,这就是它应该如何工作,但不知何故 eclipselink 加载静态链接到项目的不正确的域版本并从中加载字段名称。
我已经开始深入研究 eclipselink 代码,但尤其是这个映射部分并不是很简单。
最佳答案
Eclipselink 使用 ASM 直接从类的字节表示构建元数据。它通过 getResourceAsStream(className) 加载类。我的类加载器已将这些调用委托(delegate)给父类加载器,这就是为什么始终使用静态链接域的原因。
关于java - weblogic下使用自定义类加载器加载eclipselink域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616699/