Caused by: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 16; 文档根元素 "configuration" 必须匹

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [E:\Eclipse-neon\workspace\e3-manager\e3-manager-web\target\classes\spring\applicationContext-dao.xml]: Invocation of init method failed; nested exception is org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 16; 文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null"。
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
	at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4939)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5434)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 16; 文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null"。
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:256)
	at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:125)
	at org.apache.ibatis.builder.xml.XMLConfigBuilder.<init>(XMLConfigBuilder.java:75)
	at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:358)
	at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:340)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
	... 21 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 16; 文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null"。
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:396)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.rootElementSpecified(XMLDTDValidator.java:1599)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(XMLDTDValidator.java:1877)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:742)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1359)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$ContentDriver.scanRootElementHook(XMLDocumentScannerImpl.java:1289)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
	at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:254)
	... 27 more

宜立方商城项目,在修改完上一个bug后执行maven build的时候出现报错:

Caused by: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 16; 文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null"。


出现错误原因:

mybatis的SqlmapConfig配置文件信息没有写全,差了一句:

<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">


修改方法:

将SqlMapConfig文件的头信息修改如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
		PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
		"http://mybatis.org/dtd/mybatis-3-config.dtd">



反思:

1,以前以为xml文件这个带叹号开头的这两句是注释,真是醉了。。。


<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.qs.birp.jgAudit.JgAuditHeadDao"> <select id="getReqByReqNo" resultType="jg_audit_head" parameterType="String"> select * from jg_audit_head where request_no = #{request_no} limit 1; </select> <select id="showJgAuditHead" resultType="jg_audit_head"> SELECT * FROM jg_audit_head <where> and is_show = "1" <if test=&#39;request_no !=null and request_no !=""&#39;>and request_no =#{request_no} </if> <if test=&#39;purchase_no !=null and purchase_no !=""&#39;>and purchase_no =#{purchase_no} </if> <if test=&#39;project_number !=null and project_number !=""&#39;>and project_number =#{project_number} </if> <if test=&#39;project_name !=null and project_name !=""&#39;> and project_name like "%"#{project_name}"%"</if> <if test=&#39;company_code !=null and company_code !=""&#39;>and company_code =#{company_code} </if> <if test=&#39;sssdwdm !=null and sssdwdm !=""&#39;>and sssdwdm =#{sssdwdm}</if> <if test=&#39;ssxdwdm !=null and ssxdwdm !=""&#39;>and ssxdwdm =#{ssxdwdm}</if> <if test=&#39;status !=null and status !=""&#39;>and status =#{status}</if> <if test=&#39;company_code_values!=null and company_code_values.size()>0&#39;> and company_code in <foreach collection="company_code_values" item="item" open="(" separator="," close=")"> #{item} </foreach> </if> </where> limit #{currIndex}, #{pageSize} ; </select> <select id="showJgAuditHeadCount" resultType="Integer"> SELECT count(*) FROM jg_audit_head <where> and is_show = "1" <if test=&#39;request_no !=null and request_no !=""&#39;>and request_no =#{request_no} </if> <if test=&#39;purchase_no !=null and purchase_no !=""&#39;>and purchase_no =#{purchase_no} </if> <if test=&#39;project_number !=null and project_number !=""&#39;>and project_number =#{project_number} </if> <if test=&#39;project_name !=null and project_name !=""&#39;> and project_name like "%"#{project_name}"%"</if> <if test=&#39;company_code !=null and company_code !=""&#39;>and company_code =#{company_code} </if> <if test=&#39;sssdwdm !=null and sssdwdm !=""&#39;>and sssdwdm =#{sssdwdm}</if> <if test=&#39;ssxdwdm !=null and ssxdwdm !=""&#39;>and ssxdwdm =#{ssxdwdm}</if> <if test=&#39;status !=null and status !=""&#39;>and status =#{status}</if> <if test=&#39;company_code_values!=null and company_code_values.size()>0&#39;> and company_code in <foreach collection="company_code_values" item="item" open="(" separator="," close=")"> #{item} </foreach> </if> </where> </select> </mapper> 请你帮我分析 什么原因导致服务起不来
03-08
<think>好的,我现在要帮用户分析为什么这个MyBatisMapper文件会导致服务起不来。首先,我需要仔细看看用户提供的XML代码,找出可能的问题点。 首先,检查XML的声明和DOCTYPE是否正确。用户提供的代码中,XML版本和编码是正确的,DOCTYPE的public ID和DTD链接也没有明显错误,这部分应该没问题。 接下来看mapper的namespace属性,指向的是com.qs.birp.jgAudit.JgAuditHeadDao,这应该对应Java接口的完整类名。如果这个路径不正确,可能会导致MyBatis找不到对应的映射,从而引发错误,但通常这种情况下服务可能启动时报找不到mapper的错误,而不是完全起不来。不过还是需要确认是否存在拼写错误或者包路径不正确的情况。 然后检查各个select语句。比如第一个select的id是getReqByReqNo,参数类型是String,这里参数名是request_no,但MyBatis中如果只有一个参数,名称应该与方法参数一致。如果接口方法中的参数名不是request_no,可能会导致参数绑定失败,但通常这会引发运行时错误,而不是服务启动失败。 接下来看showJgAuditHead这个查询,它包含动态条件。这里要注意是否使用了正确的参数名,比如company_code_values在传入时是否是一个集合。如果传入的参数名不一致,或者类型不配,比如应该用List而传入了其他类型,可能会导致解析错误,但这也可能是在运行时才会报错。 另外,在动态SQL中,比如foreach循环,collection属性应该是传入参数的集合名称。如果这里写错了,比如应该是companyCodes而不是company_code_values,那么解析时会出错,导致启动时加载失败。例如,如果接口方法中没有名为company_code_values的参数,这里就会报错,导致MyBatis初始化失败,进而整个服务启动失败。 还有,检查SQL语句中的占位符是否正确。例如,like语句中使用的是"%"#{project_name}"%",这里是否正确?MyBatis中正确的写法应该是concat(&#39;%&#39;,#{project_name},&#39;%&#39;),但用户这里用的是双引号包围,可能在某些数据库中会导致语法错误,但更多是运行时的问题,而不是启动问题。 再看看resultType是否正确。用户写的是jg_audit_head,这应该是MyBatis的别名配置或者全限定类名。如果配置文件中没有为jg_audit_head配置对应的类,或者类名不正确,会导致映射失败,可能引发启动时的错误,尤其是在启用严格映射检查的情况下。 另外,检查是否有语法错误,比如标签未正确闭合,或者特殊符号未转义。比如在XML中,像"<"这样的符号需要转义,但用户的代码中似乎没有这种情况,不过动态SQL中的比较符号如"<"应该用<代替。例如,在status的判断中,如果status参数包含特殊字符,或者XML解析器认为这里有标签,就会导致解析错误,进而服务启动失败。 还有可能的问题是SQL语句中的分号,比如limit后面有分号。在MyBatis中,通常不需要在SQL语句末尾加分号,有些数据库可能不允许,这可能导致SQL语法错误,但通常是在执行时报错,而不是启动时。 另外,检查是否重复的id,比如两个select有相同的id,这会导致MyBatis初始化失败,但用户提供的代码中id都是唯一的,所以这点应该没问题。 此外,MyBatis配置文件中是否正确地扫描到了这个Mapper文件?如果路径配置错误,或者该文件没有被正确加载,会导致Mapper未被注册,进而服务启动失败。但用户的问题可能更直接与XML内容有关,所以需要先排除文件本身的问题。 总结可能的原因: 1. 动态SQL中的collection属性值不正确,比如company_code_values与实际参数名不配,导致MyBatis初始化时解析失败,引发启动错误。 2. XML中的特殊字符未正确转义,比如在<if test=&#39;status !=null and status !=""&#39;>中,如果status的值包含特殊符号,可能导致XML解析错误。 3. resultType或parameterType的类名配置错误,导致MyBatis找不到对应的类,从而初始化失败。 4. Mapper的namespace与对应的Java接口不配,导致无法绑定,但通常这是启动时的错误,可能导致服务无法启动。 5. SQL语句中的语法问题,如分号或like语句写法,可能在某些数据库驱动中导致问题,但更可能在运行时出错。 其中,最可能导致服务启动失败的原因是XML解析错误,比如动态SQL中的某个部分写错了,导致MyBatis在初始化时无法解析该Mapper文件。例如,foreach中的collection属性如果引用了不存在的参数,会抛出异常,导致应用启动失败。例如,如果company_code_values在接口方法中没有对应的参数,或者参数类型不是集合,就会在启动时抛出异常,导致服务无法启动。</think>这个MyBatis映射文件可能导致服务启动失败的主要原因如下: **1. XML特殊字符未转义** - 在`<if test=&#39;status !=null and status !=""&#39;>`中,`!=`符号可能被XML解析器识别为非法字符 - 正确写法应为:`<if test="status != null and status != &#39;&#39;">`(使用实体编码或CDATA块) **2. 集合参数处理问题** - `<foreach collection="company_code_values">`要求接口方法必须包含名为`company_code_values`的集合参数 - 若方法参数名不配或参数类型不是`List/Collection`,会导致初始化失败 **3. ResultType映射问题** - `resultType="jg_audit_head"`需要满足以下任一条件: - 在mybatis-config.xml中定义了类型别名 - 使用全限定类名(如`com.example.JgAuditHead`) - 若未正确定义,启动时会抛出类型找不到异常 **4. SQL语法规范问题** - 分号结尾的`limit #{currIndex}, #{pageSize};`在某些数据库驱动中会报错 - 建议移除末尾分号 **5. 参数占位符问题** - `like "%"#{project_name}"%"`应改为: ```xml <bind name="pattern" value="&#39;%&#39; + project_name + &#39;%&#39;"/> like #{pattern} ``` 或使用SQL函数: ```xml like CONCAT(&#39;%&#39;, #{project_name}, &#39;%&#39;) ``` **6. 参数类型配** - 所有`#{参数名}`需要严格配接口方法的参数: - 若使用`@Param`注解,名称必须完全一致 - 若使用Map传参,key必须存在 **排查建议:** 1. 检查应用启动日志中的`org.apache.ibatis`相关错误 2. 确认`mybatis-config.xml`中: ```xml <typeAliases> <typeAlias type="完整实体类路径" alias="jg_audit_head"/> </typeAliases> ``` 3. 验证Mapper接口方法参数与XML中的`#{}`参数名一致性 4. 使用XML验证工具检查特殊字符(推荐将动态SQL写在`<![CDATA[ ]]>`中) **典型错误日志特征:** ```log ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML... |-- Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成 |-- Caused by: org.apache.ibatis.reflection.ReflectionException: 没有找到对应的结果字段... ``` 建议按以下顺序排查:XML语法 → 参数映射 → 类型别名 → SQL语法。可通过逐步注释SQL片段来定位具体问题节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值