作为我们应用程序的一部分,我们使用的是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
文件。但没有成功
以上都不适合我们。
非常感谢任何帮助。
答案 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 ,您可以查看自己的依赖关系。