title: Spring MVC 3.0.0 app won't bootstrap on Weblogic Server 11gR1 - ClassCastException
body: <p>I have a Spring MVC (3.0.0.RELEASE) based application I need to deploy to Oracle Weblogic Server 11gR1.  It works fine on Spring TC Server. When I deploy my application WAR file (either via STS/Eclipse "Servers" view or to the "auto-deploy" folder, or manually via the web admin) I get the following exception:</p>
  
  <pre><code>    &lt;Feb 3, 2010 9:17:20 AM GMT&gt; &lt;Error&gt; &lt;org.springframework.web.context.ContextLoader&gt; &lt;BEA-000000&gt; &lt;Context initialization failed
  org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/spring/webapp-config.xml]; nested exception is java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
   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.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
   at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93)
   at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
   at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:458)
   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:388)
   at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
   at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)
   at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
   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:121)
   at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:181)
   at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1801)
   at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3045)
   at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1397)
   at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:460)
   at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
   at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:83)
   at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
   at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)
   at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:247)
   at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
   at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:83)
   at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
   at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)
   at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:1267)
   at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:83)
   at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:409)
   at weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:39)
   at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:161)
   at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
   at weblogic.deploy.internal.targetserver.BasicDeployment.activate(BasicDeployment.java:184)
   at weblogic.deploy.internal.targetserver.BasicDeployment.activateFromServerLifecycle(BasicDeployment.java:361)
   at weblogic.management.deploy.internal.DeploymentAdapter$1.doActivate(DeploymentAdapter.java:51)
   at weblogic.management.deploy.internal.DeploymentAdapter.activate(DeploymentAdapter.java:196)
   at weblogic.management.deploy.internal.AppTransition$2.transitionApp(AppTransition.java:30)
   at weblogic.management.deploy.internal.ConfiguredDeployments.transitionApps(ConfiguredDeployments.java:233)
   at weblogic.management.deploy.internal.ConfiguredDeployments.activate(ConfiguredDeployments.java:169)
   at weblogic.management.deploy.internal.ConfiguredDeployments.deploy(ConfiguredDeployments.java:123)
   at weblogic.management.deploy.internal.DeploymentServerService.resume(DeploymentServerService.java:173)
   at weblogic.management.deploy.internal.DeploymentServerService.start(DeploymentServerService.java:89)
   at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)
   at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
   at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
  </code></pre>
  
  <p>Which is caused by:</p>
  
  <pre><code>Caused By: java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory
   at javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)
   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:388)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
   at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
   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.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:124)
   at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:93)
   at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
   at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:458)
   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:388)
   at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
   at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:192)
   at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
   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:121)
   at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:181)
   at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1801)
   at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3045)
   at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1397)
   at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:460)
   at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
   at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:83)
   at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
   at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)
   at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:247)
   at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
   at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:83)
   at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
   at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)
   at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:1267)
   at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:83)
   at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:409)
   at weblogic.application.internal.SingleModuleDeployment.activate(SingleModuleDeployment.java:39)
   at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:161)
   at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:79)
   at weblogic.deploy.internal.targetserver.BasicDeployment.activate(BasicDeployment.java:184)
   at weblogic.deploy.internal.targetserver.BasicDeployment.activateFromServerLifecycle(BasicDeployment.java:361)
   at weblogic.management.deploy.internal.DeploymentAdapter$1.doActivate(DeploymentAdapter.java:51)
   at weblogic.management.deploy.internal.DeploymentAdapter.activate(DeploymentAdapter.java:196)
   at weblogic.management.deploy.internal.AppTransition$2.transitionApp(AppTransition.java:30)
   at weblogic.management.deploy.internal.ConfiguredDeployments.transitionApps(ConfiguredDeployments.java:233)
   at weblogic.management.deploy.internal.ConfiguredDeployments.activate(ConfiguredDeployments.java:169)
   at weblogic.management.deploy.internal.ConfiguredDeployments.deploy(ConfiguredDeployments.java:123)
   at weblogic.management.deploy.internal.DeploymentServerService.resume(DeploymentServerService.java:173)
   at weblogic.management.deploy.internal.DeploymentServerService.start(DeploymentServerService.java:89)
   at weblogic.t3.srvr.SubsystemRequest.run(SubsystemRequest.java:64)
   at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
  </code></pre>
  
  <p>Now this is after I have already discovered the need to set:</p>
  
  <pre><code>&lt;wls:prefer-web-inf-classes&gt;true&lt;/wls:prefer-web-inf-classes&gt;
  </code></pre>
  
  <p>in weblogic.xml (that fixed my myriad of earlier problems - the classpath was totally screwed and I was getting "NoSuchMethodError" problems for Spring's "getBeanDefinitionDefaults(...) which was bundled in my WAR's WEB-INF/lib directory).</p>
  
  <p>Investigation has shown that <code>javax.xml.parsers.DocumentBuilderFactory</code> comes from xml-apis-1.0.b2.jar which is being brought in by maven from commons-digester, dom4j and jdom.  In short, I need it for my Spring App to run. </p>
  
  <p>I've checked (and double checked) and I'm <em>not</em> bundling the weblogic class with my war so I'm not shooting myself in my own foot.</p>
  
  <p>I've also seen this post on the java.net forums: <a href="http://forums.java.net/jive/thread.jspa?messageID=216363" rel="nofollow noreferrer">http://forums.java.net/jive/thread.jspa?messageID=216363</a> - the Log4J workaround didn't work (I presume because the root of the problem isn't Log4J) and this bug fix note on oracle.com (search for "CR172469") <a href="http://download-llnw.oracle.com/docs/cd/E13222_01/wls/docs81/notes/resolved_sp03.html" rel="nofollow noreferrer">http://download-llnw.oracle.com/docs/cd/E13222_01/wls/docs81/notes/resolved_sp03.html</a>  This seems to do nothing either.</p>
  
  <p>What I don't understand is, I'm telling Weblogic to prefer the jars in my WEB-INF/lib, the jar I need is in there, and the error is coming from Spring, not Weblogic (i.e. I'm not forcing the server itself to use a jar it can't handle.)</p>
  
  <p>I've held off from adding more of my Spring config to this question as I'm not sure its relevant.  If however this would help, please let me know and I'll add it.</p>
  
  <p>Hope someone can help.</p>
  
  <p>Regs, Andrew</p>