问题描述
在基于微服务架构风格的项目开发过程中,为了提高快速开发的目的,提高开发效率,集成了 MyBatisPlus,对于 MyBatisPlus 封装的 CRUD API 接口已经非常强大了,但是有时还是需要使用其动态 SQL 的拼接,在单个模块开发完成后,启动测试时遇到了个梗,异常信息“ Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。 ”
具体的错误信息如下:
Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 57; columnNumber: 24; 元素内容必须由格式正确的字符数据或标记组成。
at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:259)
at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:125)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.<init>(XMLMapperBuilder.java:78)
at com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean.buildSqlSessionFactory(MybatisSqlSessionFactoryBean.java:581)
... 81 common frames omitted
Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.startOfMarkup(XMLDocumentFragmentScannerImpl.java:2636)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2734)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
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:348)
at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:257)
... 84 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:54640', transport: 'socket'
Process finished with exit code 1
部分截图如下图:
解决办法
各种摸索,各种尝试,最后总结出来两种解决办法,在这儿记录一下(为什么网上有了我还要写呢,我浏览了一下,所有都是XJBG的,最早的一篇关于这个问题的解释是出现在2015年,而后都是清一色的一样一样的。。。)
在这儿所有的看到这篇文章的老铁们,注意咯,MyBatis 在编写动态SQL的时候,是基于OGNL的,只要记住这一点,你就一定不会错了,至于什么 OGNL,OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,OGNL为什么这么受欢迎呢,原因很简单,它相对其它表达式语言具有下面几大优势:
1、基本对象树的访问;
2、对容器变量的访问;
3、使用操作符号;
4、容器、数组、对象;
5、对静态方法或变量的访问;
6、方法调用;
7、投影和选择;
1、不改变符号,依然使用 “ > ” 或者 “ < ” ,则需要使用 OGNL 标签,将该符号包起来,可以是包裹单个符号,也可以将整句包裹寄来,示例SQL如下:
<select id="getLoginLogByPage" resultType="com.mcp.entity.LoginLog">
SELECT l.id, l.job_number, l.name, l.createDate, l.ip_addr
, l.remark
FROM loginlog l
<where>
<if test="jobNumber != null" >
<![CDATA[ and l.job_number > #{jobNumber}]]>
</if>
</where>
GROUP BY l.today_date, l.ip_address;
</select>
2、使用 OGNL 语法表达式,在 OGNL 语法表达式中不能直接写符号,需要要使用其转义后的字符,对应如下:
符号 | 转义字符 | 说明 |
< | < | 小于 |
<= | <= | 小于等于 |
> | > | 大于 |
>= | >= | 大于等于 |
& | & | 逻辑与 |
'xxx' | ' | 单引号 |
"xxx" | " | 双引号 |
示例 SQL:
<select id="getLoginLogByPage" resultType="com.mcp.entity.LoginLog">
SELECT l.id, l.job_number, l.name, l.createDate, l.ip_addr
, l.remark
FROM loginlog l
<where>
<if test="jobNumber != null" >
and l.job_number > #{jobNumber}
</if>
</where>
GROUP BY l.today_date, l.ip_address;
</select>
就可以正常的启动了,如下图:
好了,关于 org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。 的解决办法 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。
作 者: | 华 仔 |
联系作者: | who.seek.me@java98k.vip |
来 源: | CSDN (Chinese Software Developer Network) |
原 文: | https://blog.csdn.net/Hello_World_QWP/article/details/86513179 |
版权声明: | 本文为博主原创文章,请在转载时务必注明博文出处! |