spring 应用程序不启动:SAXParseException:文档根元素“beans”,必须匹配 DOCTYPE 根“null”

Posted

技术标签:

【中文标题】spring 应用程序不启动:SAXParseException:文档根元素“beans”,必须匹配 DOCTYPE 根“null”【英文标题】:spring application does not start: SAXParseException: Document root element "beans", must match DOCTYPE root "null" 【发布时间】:2012-01-29 10:12:59 【问题描述】:

我刚刚将一个应用程序部署到了 tomcat 6.0.32 版,我从 spring 中收到了这个错误。我不认为 xml 无效

PAS:2011-12-28 14:19:08,585 信息 [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] - PAS:2011-12-28 14:19:08,592 错误 [org.springframework.web.context.ContextLoader] - org.springframework.beans.factory.BeanDefinitionStoreException:来自 ServletContext 资源 [/WEB-INF/config/applicationContext.xml] 的 XML 文档中的第 15 行无效;嵌套异常是 org.xml.sax.SAXParseException:文档根元素“beans”,必须匹配 DOCTYPE 根“null”。 org.xml.sax.SAXParseException:文档根元素“beans”,必须匹配 DOCTYPE 根“null”。 在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195) 在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131) 在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384) 在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318) 在 com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.rootElementSpecified(XMLDTDValidator.java:1621) 在 com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(XMLDTDValidator.java:1900) 在 com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:764) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1363) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(XMLDocumentScannerImpl.java:1318) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3104) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:922) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119) 在 com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235) 在 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284) 在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:222) 在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:173) 在 org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:148) 在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:129) 在 org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:145) 在 org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:126) 在 org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) 在 org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:89) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:262) 在 org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:139) 在 org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:252) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:190) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:49) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4205) 在 org.apache.catalina.core.StandardContext.start(StandardContext.java:4704) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601) 在 org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943) 在 org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778) 在 org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504) 在 org.apache.catalina.startup.HostConfig.start(HostConfig.java:1315) 在 org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324) 在 org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1061) 在 org.apache.catalina.core.StandardHost.start(StandardHost.java:840) 在 org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) 在 org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) 在 org.apache.catalina.core.StandardService.start(StandardService.java:525) 在 org.apache.catalina.core.StandardServer.start(StandardServer.java:754) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:595) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

XML 是:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:util="http://www.springframework.org/schema/util"   xmlns:security="http://www.springframework.org/schema/security"

  xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://www.springframework.org/schema/util
       http://www.springframework.org/schema/util/spring-util-2.5.xsd
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security-2.5.xsd">

<context:property-placeholder  location="WEB-INF/passport.properties, WEB-INF/config/server.properties"/>
<util:properties id="props" location="WEB-INF/passport.properties" />

<context:component-scan base-package="util" />

<bean id="passportConfig" class="util.PassportBaseConfig"
    p:configLocation="WEB-INF/" autowire="no" factory-method="getInstance"
    init-method="init" p:userDAO-ref="passportUserDao" p:teamDAO-ref="passportTeamDao" 
    p:serverId="$serverId">
    <constructor-arg ref="props" />

</bean>

【问题讨论】:

【参考方案1】:

来自此消息

org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null". 

在我看来,您的 DTD 不正确并且版本不匹配。您在 DTD 中使用新版本并提供较旧的 jar。

【讨论】:

刚刚更新了 XML。我从错误的 applicationContext.xml 复制了 bean 定义。我看到他们我正在使用 xsd 定义。 看起来我在一个单独的目录中有一个旧的 spring.jar,这弄乱了我的构建过程。谢谢 很高兴它为您服务。请接受任何有帮助的答案。 尝试将 .jar 放入新文件夹。我们发现我们的文件夹(.jar 所在的位置)包含与应用程序本身完全不同的 application.xml 文件。【参考方案2】:

不要在你的 spring 配置文件中使用 DOC 类型。

而是像这样启动你的 spring 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

另外,请务必关闭配置文件末尾的 beans 标签。

</beans>

这里是 spring 3.1 参考中IOC Container Info 的链接

【讨论】:

嗯,XML 是格式良好的 XML。我漏掉了bean的原因是因为还有很多其他的enteries,并且出于安全原因,我漏掉了一些enteries。【参考方案3】:

看看这个例子:Creating a Spring Application

注意您的 XML 和正确的 applicationContext.xml 之间的区别。您缺少对命名空间的所有引用。

【讨论】:

【参考方案4】:

我遇到了这个错误:

线程“main”中的异常 org.springframework.beans.factory.BeanDefinitionStoreException:行 ...在来自类路径资源 [applicationContext.xml] 的 XML 文档中 是无效的;嵌套异常是 org.xml.sax.SAXParseException; 电话号码: ...;列号:...;文档根元素“beans”, 必须匹配 DOCTYPE 根“null”。 org.xml.sax.SAXParseException; 文档根元素“beans”,必须匹配 DOCTYPE 根“null”。

我已经通过添加解决了:

xmlns:context="http://www.springframework.org/schema/context"

在 applicationContext.xml 文件中并添加正确版本的依赖项,就像在我的情况下,我使用 3.2.3.RELEASE 作为 spring-context-support 依赖项。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>**3.2.3.RELEASE**</version>
</dependency>

【讨论】:

以上是关于spring 应用程序不启动:SAXParseException:文档根元素“beans”,必须匹配 DOCTYPE 根“null”的主要内容,如果未能解决你的问题,请参考以下文章

如何在不依赖 MongoDB 的情况下启动 spring-boot 应用程序?

Flyway Spring Boot应用程序在启动时不应用插入脚本

在不启动服务器的情况下使用 Spring 应用程序属性 [重复]

Spring Boot,更新前端而不重新启动应用程序

JPackaged JavaFX + Spring boot 不启动

在spring-boot启动期间tomcat数据源不检查有效连接?