我正在将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>
请帮忙。谢谢!
答案 0 :(得分:13)
我回答我自己的问题:
以下链接激发了我解决此问题的方法:
Dealing with "Xerces hell" in Java/Maven?
Basiclly我已经删除了pom.xml中xml-api和xmlParserAPIs的所有依赖项。问题是固定的。根本原因是我的classpath不应该包含任何导致库与Weblogic应用服务器冲突的javax库。希望能帮助到你。
答案 1 :(得分:0)
我有类似的问题。我正在使用在狂野服务器上安装的应用程序。问题是我必须将xerces jars放在应用程序的框架和第三方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