.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl cannot be added to javax.xml.parsers.DocumentBuilderFactory

I am updating the Weblogic server from 9 to 10.3.6. when i try to deploy my ear application and got below exception.

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) 

I tried all kinds of things, including adding weblogic-application.xml, but it still doesn't work.

 <?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> 

My weblogic.xml has

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

This is part of my pom.xml:

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

Please, help. Thanks!

+8
source share
2 answers

I answer my question:

The link below inspired me to fix this issue:

Working with "Xerces hell" in Java / Maven?

I basically removed all the xml-api and xmlParserAPI dependencies in pom.xml. The problem is fixed. The root cause is that my classpath should not include any javax libraries that cause library conflicts with the Weblogic application server. Hope it helps.

+13
source

I had a similar problem. I used an application installed on a wild server. The problem was that I had to put jerces jar both in the framework and in the third-party lib folder of the application. After much research, I found a solution in the xerces documentation.

Why am I getting a ClassCastException when using Xerces and WebSphere Application Server? Xerces uses the ObjectFactory class to dynamically load some classes, such as Parser Configuration. ObjectFactory finds the specified implementation class by querying the system property, reading the META-INF / services / factoryId file, or using the spare class name. After the implementation is found, ObjectFactory attempts to load the file using the context class loader, and if it is null, ObjectFactory uses the system class loader. If you run Xerces in an environment such as WebSphere Application Server that has several class loaders, you can get a ClassCastExceptions exception from Xerces because different class loaders can be involved in loading Xerces classes. For example, ClassCastExceptions can occur when utility EAR classes using Xerces load Xerces classes from WAR modules. We suggest that you read the article, โ€œAvoiding ClassCastExceptions ... exceptions,โ€ which explains how to work around this problem. You can also read the article "Demystifying J2EE Class Loads", which explains how multiple class loaders work in WebSphere Application Server.

"

Basically, use two util classes to create a domparser object. To call a service from your application, modify the class loader and create an object. After processing, return the class loader back.

 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

0
source

Source: https://habr.com/ru/post/958119/


All Articles