.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 不能转换为 javax.xml.parsers.Docume

Posted

技术标签:

【中文标题】.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 不能转换为 javax.xml.parsers.DocumentBuilderFactory【英文标题】:.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be cast to javax.xml.parsers.DocumentBuilderFactory 【发布时间】:2013-11-28 08:00:48 【问题描述】:

我正在将 Weblogic 服务器从 9 升级到 10.3.6。当我试图部署我的耳朵应用程序并得到以下异常时。

Caused By: java.lang.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be cast to javax.xml.parsers.DocumentBuilderFactory
    at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:123)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.createDocumentBuilderFactory(DefaultDocumentLoader.java:89)
    at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:70)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:342)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)
    at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:80)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:123)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:423)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:353)
    at org.springframework.context.access.ContextSingletonBeanFactoryLocator.initializeDefinition(ContextSingletonBeanFactoryLocator.java:141)
    at org.springframework.beans.factory.access.SingletonBeanFactoryLocator.useBeanFactory(SingletonBeanFactoryLocator.java:384)
    at org.springframework.web.context.ContextLoader.loadParentContext(ContextLoader.java:341)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:195)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:481)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
    at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:181)
    at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1868)

我尝试了各种方法,包括添加 weblogic-application.xml,但仍然无法正常工作。

<?xml version="1.0" encoding="UTF-8"?>
   <weblogic-application>
 <xml>
 <parser-factory>
    <saxparser-factory>
      org.apache.xerces.jaxp.SAXParserFactoryImpl
    </saxparser-factory>
    <document-builder-factory>
      org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
    </document-builder-factory>
    <transformer-factory>
      org.apache.xalan.processor.TransformerFactoryImpl
    </transformer-factory>
  </parser-factory>
</xml>

<prefer-application-packages>
 <package-name>org.apache.xerces.parsers.*</package-name>
</prefer-application-packages>
</weblogic-application>

我的 weblogic.xml 有

<prefer-web-inf-classes>true</prefer-web-inf-classes>

这是我的 pom.xml 的一部分:

<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.8.1</version>
<scope>runtime</scope>
</dependency>

请帮忙。谢谢!

【问题讨论】:

【参考方案1】:

我遇到了类似的问题。我正在使用安装在狂野服务器上的应用程序。问题是我必须将 xerces jar 放在应用程序的框架和第三方 lib 文件夹中。经过大量研究,我在 xerces 的文档中找到了解决方案。

为什么我在使用 Xerces 和 WebSphere Application Server 时会收到 ClassCastException? Xerces 使用 ObjectFactory 类来动态加载一些类,例如解析器配置。 ObjectFactory 通过查询系统属性、读取 META-INF/services/factoryId 文件或使用回退类名来查找指定的实现类。找到实现后,ObjectFactory 尝试使用上下文类加载器加载文件,如果它为 null,则 ObjectFactory 使用系统类加载器。 如果您在具有多个类加载器的环境(例如 WebSphere® Application Server)中运行 Xerces,您可能会从 Xerces 抛出 ClassCastExceptions,因为加载 Xerces 类时可能涉及不同的类加载器。例如,当使用 Xerces 的实用程序 EAR 类从 WAR 模块加载 Xerces 类时,可能会发生 ClassCastExceptions。 我们建议您阅读“避免 ClassCastExceptions...”文章,该文章解释了此问题的解决方法。此外,您可能还想阅读“J2EE 类加载揭秘”一文,该文章解释了多个类加载器如何在 WebSphere Application Server 中工作。

"

基本上,使用两个 util 类来创建 domparser 对象。对于来自应用程序的服务调用,更改类加载器并创建对象。完成处理后,恢复类加载器。

ClassLoader savedClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader currentClassLoader = this.getClass().getClassLoader() ;
Thread.currentThread().setContextClassLoader(currentClassLoader);
//do the processing, after that revert back

https://xerces.apache.org/xerces2-j/faq-general.html

【讨论】:

【参考方案2】:

我回答我自己的问题:

下面的链接启发了我解决这个问题:

Dealing with "Xerces hell" in Java/Maven?

基本上我已经删除了 pom.xml 中 xml-api 和 xmlParserAPIs 的所有依赖项。问题已解决。根本原因是我的类路径不应包含任何导致库与 Weblogic 应用服务器冲突的 javax 库。希望能帮助到你。

【讨论】:

你能告诉我你做了什么吗?我将 Spring MDP 添加到 WL 应用程序中,现在它不会部署并出现相同的错误。

以上是关于.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 不能转换为 javax.xml.parsers.Docume的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:java.lang.ClassCastException

应用 PathProperties 后的 ClassCastException

MIUI 11/12 主题切换导致 LifeCycleException、ClassCastException

ClassCastException 发生在 onRestoreInstanceState

Java HashMap导致ClassCastException

用 Java Lambda 编写的 Spark UDF 引发 ClassCastException