启动weblogic时出现java.lang.ClassCastException:org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

时间:2010-03-15 06:38:13

标签: weblogic cxf classcastexception weblogic9.x

作为我们应用程序的一部分,我们使用的是apache的xerces jaxp解析器。当我们在weblogic 9.2上部署应用程序时,我们收到以下错误。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.cxf.wsdl.WSDLManager' defined in class path resource [META-INF/cxf/cxf.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.apache.cxf.wsdl11.WSDLManagerImpl]: Constructor threw exception; nested exception is java.lang.ClassCastException: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

根据我们的分析,weblogic正试图加载自己的DocumentBuilderFactoryImpl,它存在于 weblogic.jar 而不是apache的xerces中。

我们尝试以下操作强制weblogic从xerces

加载DocumentBuilderFactoryImpl

i)我们已将以下标记添加到weblogic.xml

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

ii)我们已将最新版本的xalan放在jre / lib / endorced文件夹中。这并没有解决我们的问题。

ii)我们在weblogic-application.xml

中添加了条目
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
 <application-param>
  <param-name>webapp.encoding.default</param-name>
  <param-value>UTF-8</param-value>
 </application-param>
 <prefer-application-packages>
  <package-name>javax.jws.*</package-name>
  <package-name>org.apache.xerces.*</package-name>
  <package-name>org.apache.xerces.jaxp.*</package-name>
 </prefer-application-packages>
</weblogic-application>

ii)在weblogic-application.xml

中添加了以下条目
<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>

iii)添加jaxp.properties从xerces加载DocumentBuilderFactoryImpl到jre / lib并启动服务器。在这种情况下,weblogic没有启动。

iv)然后我们首先启动服务器,然后在服务器启动的运行时复制jaxp.properties文件。但没有成功

以上都不适合我们。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

你做了很多我不了解确切状态的事情。我的建议是严格遵循我过去使用WLS 9.2成功使用的WebLogic Application Server Specific Configuration Guide

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
    <application-param>
        <param-name>webapp.encoding.default</param-name>
        <param-value>UTF-8</param-value>
    </application-param>
    <prefer-application-packages>
        <package-name>javax.jws.*</package-name>
    </prefer-application-packages>
</weblogic-application>

您必须在prefer-application-packages下添加更多软件包以设置Weblogic ClassLoader filtering,但在问题的当前状态下,无法提供准确的答案。


以防万一,您可以尝试盲目使用this thread中的weblogic-application.xml

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">
    <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>
    <application-param>
        <param-name>webapp.encoding.default</param-name>
        <param-value>UTF-8</param-value>
    </application-param>
    <prefer-application-packages>
        <package-name>javax.jws.*</package-name>
        <package-name>org.apache.xerces.*</package-name>
        <package-name>org.apache.xalan.*</package-name>
    </prefer-application-packages>
</weblogic-application> 

但这是在黑暗中拍摄的。

答案 1 :(得分:1)

您可以尝试强制使用指定的文档构建器工厂作为命令行选项:

-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl

这假设您在类路径中具有所需的Xerces构建器工厂类。

通常,除非某些遗留代码需要,否则不应再使用单独的xerces.jar。 Xerces解析器类附带JRE,包名称只是以com.sun.org.apache而不是org.apache开头。你也可以尝试

-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

并从类路径中删除xerces.jar(这是我们在WLS 10.3和Java 1.6上所做的)。

答案 2 :(得分:1)

我设法通过简单的解决方案解决了未找到的DocumentBuilderFactory 问题。

尝试将xercesImpl.jar复制到weblogic MyDomain \ servers \ MyServer \ lib上的特定于域的lib目录。

答案 3 :(得分:0)

在我的情况下,问题在于我依赖于 commons-digester ,后者又使用了另一个版本的 xerces (导致冲突)。因此,如果传递了其他版本的 xerces ,您可以查看自己的依赖关系。