有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java可以使用“不包含ObjectFactory.class或jaxb.index”来进一步澄清类加载器问题

很明显,我已经为我们得到的错误实现并验证了一个解决方案,但我只想了解这里发生的事情的本质。我看过这个问题的类似例子,答案通常不会超过仅仅提供解决方案

我使用的应用程序使用jar文件和从XJC生成的JAXB注释类。jar文件在每个相关包中都有ObjectFactory类

应用程序以标准EAR格式部署,并部署到WebLogic。web应用程序具有web内容,但web模块和“ejb”模块(实际上没有任何ejb)使用的所有JAR都位于EAR中的共享库目录中

集成层使用JAXB类来调用一组web服务。JSP页面引用最终调用此集成层的类,尽管也有运行的后台任务引用集成层

大多数时候,所有这些都很好。但是,在某些情况下,从前端发起的调用会失败,并出现如下错误:

javax.xml.bind.JAXBException: "..." doesnt contain ObjectFactory.class or jaxb.index

经过一段时间的搜索,我在Annotated JAXB Classes 找到了一篇博客文章的随机回复,这篇文章让我找到了解决方案。在我们的集成层中,我们为所需的包创建一个JAXBContext。键重写了“JAXBContext.newInstance()”调用中的默认类加载器,以在集成层中使用实用程序类的类加载器

WebLogic,可能与其他应用程序服务器一样,创建了一个类加载器层次结构,使得web模块由一个类加载器加载,ejb模块由另一个类加载器加载。web模块类加载器中加载的类可以调用ejb类加载器中的类,但不能反过来调用(这并不重要)

我假设当集成层中的实用程序类被web模块类加载器(而不是ejb模块类加载器)首先加载的类间接调用时,会发生错误。集成层中的实用程序类最初可能是由ejb模块类加载器加载的(尽管我想知道这是否是个意外)。通过将“JAXBContext.newInstance()”中使用的类加载器更改为ejb模块类加载器,可以找到ObjectFactory

这就是我对这件事的理解。我还是想更好地理解这一点。例如,我并不十分清楚为什么ObjectFactory类对web模块类加载器不可见


共 (0) 个答案