就是这么清楚,我已经实现并验证了我们得到的错误的解决方案,但我只是想了解这里发生的内容。我已经看过同样问题的类似实例,答案通常只是提供解决方案。
我使用的应用程序使用jar文件和从XJC生成的JAXB循环类。 jar文件在每个相关包中都有ObjectFactory类。
应用程序以标准EAR格式部署并部署到WebLogic。 Web应用程序具有Web内容,但Web模块和“ejb”模块(实际上没有任何ejbs)使用的所有jar都位于EAR的共享lib目录中。
集成层使用JAXB类来调用一组Web服务。 JSP页面引用最终调用此集成层的类,尽管还有运行的后台任务也引用了集成层。
大多数时候,所有这一切都很好。但是,在某些情况下,从前端启动的调用会因以下错误而失败:
javax.xml.bind.JAXBException:“...”不包含ObjectFactory.class 或者jaxb.index
经过一番搜索,我设法找到了对Annotated JAXB Classes 的博客文章的随机回复,这使我得到了解决方案。在我们的集成层中,我们为所需的包创建了一个JAXBContext。关键是覆盖“JAXBContext.newInstance()”调用中的默认类加载器,以在集成层中使用实用程序类的类加载器。
WebLogic可能与其他应用程序服务器一样,创建一个类加载器层次结构,以便Web模块由一个类加载器加载,而ejb模块由另一个类加载器加载。在web模块类加载器中加载的类可以调用ejb类加载器中的类,但不是相反(这不重要)。
我假设当集成层中的实用程序类由Web模块类加载器首先加载的类间接调用时会发生错误,而不是ejb模块类加载器。集成层中的实用程序类可能最初由ejb模块类加载器加载(尽管我不知道这是否是一个意外)。通过将“JAXBContext.newInstance()”中使用的类加载器更改为ejb模块类加载器,它允许找到ObjectFactory。
这就是我对此的理解。我还是想更好地理解这一点。例如,我不清楚为什么Web模块类加载器看不到ObjectFactory类。