今天在个spring boot微服务里面发现这个错误:
org.xml.sax.SAXParseException: 对实体 "isdialog" 的引用必须以 ';' 分隔符结尾。
分析发现就是在页面中JavaScript的url中使用了“&”符号导致识别不了,thymeleaf 的锅。一般情况下我们只是用boot来写服务端提供接口,搞前后端分离是没有什么问题的,由于这个需求比较简单,故在boot项目中直接加了几个静态页面,结果boot默认走的是thymeleaf的解析,搞的如此复杂。
记录下解决办法(只针对简单项目的js应急修改):
js使用 /*<![CDATA[*/ /*]]>*/ 包裹起来,解析就正常了。
<script th:inline="javascript">
/*<![CDATA[*/
function open3(){
window.open('http://xxxxx:8080/yyyy/&isdialog=1&id=892267');
}
/*]]>*/
</script>
分析:
thymeleaf 语法过于严格,比较死板,尤其是对html5的支持不是很好。如果项目选型中选定了thymeleaf,那可以考虑去掉她的严格验证会好些。
1、引入maven依赖
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
</dependency>
2、application.prpoerties 配置修改
spring.thymeleaf.mode=LEGACYHTML5 #设置为LEGACYHTML5编码格式
spring.thymeleaf.cache=false #关闭页面缓存