web-dev-qa-db-ja.com

.ClassCastException:org.Apache.xerces.jaxp.DocumentBuilderFactoryImplをjavax.xml.parsers.DocumentBuilderFactoryにキャストできません

Weblogicサーバーを9から10.3.6にアップグレードしています。 EARアプリケーションをデプロイしようとして、例外を下回ったとき。

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>

助けてください。ありがとう!

8
user2982680

私は自分の質問に答えます:

以下のリンクから、この問題を修正するようになりました。

Java/Mavenで「Xerceshell」を処理しますか?

基本的に、pom.xmlのxml-apiとxmlParserAPIのすべての依存関係を削除しました。問題は修正されました。根本的な原因は、クラスパスに、ライブラリがWeblogicアプリサーバーと競合する原因となるjavaxライブラリを含めないことです。それが役に立てば幸い。

13
user2982680

私も同様の問題を抱えていました。ワイルドサーバーにインストールされたアプリケーションを使用していました。問題は、xercesjarをフレームワークとアプリケーションのサードパーティのlibフォルダーの両方に配置する必要があることでした。多くの調査の結果、xercesのドキュメントで解決策を見つけました。

XercesとWebSphereApplication Serverを使用しているときにClassCastExceptionが発生するのはなぜですか? XercesはObjectFactoryクラスを使用して、いくつかのクラスを動的にロードします。パーサー構成。 ObjectFactoryは、システムプロパティをクエリするか、META-INF/services/factoryIdファイルを読み取るか、フォールバッククラス名を使用して、指定された実装クラスを検索します。実装が見つかった後、ObjectFactoryはコンテキストクラスローダーを使用してファイルをロードしようとします。ファイルがnullの場合、ObjectFactoryはシステムクラスローダーを使用します。複数のクラスローダーがあるWebSphere®ApplicationServerなどの環境でXercesを実行する場合、異なるクラスローダーがXercesクラスのロードに関与する可能性があるため、XercesからClassCastExceptionsがスローされる可能性があります。たとえば、ClassCastExceptionsは、Xercesを使用するユーティリティEARクラスがWARモジュールからXercesクラスをロードするときに発生する可能性があります。この問題の回避策を説明している「ClassCastExceptionsの回避...」の記事を読むことをお勧めします。また、WebSphere ApplicationServerで複数のクラスローダーがどのように機能するかを説明している「J2EEClassLoadingDemystified」の記事を読むことをお勧めします。

「」

基本的に、2つの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

0
ashish verma