关于Thymeleaf框架的TemplateInputException解决方法
问题描述
经常在后端代码没有出现问题的情况下,前端加载Thymeleaf框架时出现
prg.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/xxx.html]")
的问题。顺便记录一下能够实现此动态加载方式的思路。
思路分析
此次是使用了之前实现了的Thymeleaf的
th:each
思路进行加载,已经成功过一次,说明代码结构无问题,贴代码:
- HTML部分
<div id="hometable" th:fragment="hometable">
<table class="layui-table">
<thead>
<tr>
<th style="width: 5%;">序号</th>
</thead>
<tbody>
<tr th:each="h:${homelist}">
<td th:text="${h.id}"></td>
<td class="td-manage">
<a title="编辑" onclick="" href="javascript:;">
<i class="layui-icon"></i>
</a>
<a title="删除" onclick="" href="javascript:;">
<i class="layui-icon"></i>
</a>
</td>
</tr>
</tbody>
</table>
</div>
- JS部分
var url = '/getAllHome';
var dataJson = eval($("#hometable").val());
$.ajax({
url: url,
type: 'POST',
success: function(data){
console.log(data);
$("#hometable").html(data);
table.render();
}
});
- Controller部分
@RequestMapping(value = "/getAllHome",method = RequestMethod.POST)
public String getAllHome(Model m){
m.addAttribute("homelist", userService.getAllHome());
return "/sys/home::hometable";
}
- Model部分
public class Home {
private int id;
private int onwerId;
private int member;
private int acctNum;
private String address;
private String nickname; //the nickname of host
private String realname; //the realname of host
}
- SQL部分
SELECT h.id, h.ownerid, h.member, h.acctnum AS acctNum, h.address, r.nickname, r.realname
FROM (home AS h LEFT JOIN user ON h.ownerid = user.id)
LEFT JOIN roleinfo AS r ON user.roleid = r.roleid
思路是使用的前端请求Table内容数据,然后后端Controller接受请求返回数据,通过异步加载的方式,再加上
table.render()
的渲染实现动态加载Table,在此之前此方式实现成功了。
此时注意到在下方仍然有提示报错:
Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "h.acctnum" (template: "/sys/home" - line 59, col 25)
解决方法
将实体类中的acctNum字段改为acctnum。此处确实是没注意到之前SQL语句又多此一举使用了AS,但其实并不影响,还是在设计实体类的时候没有注意到。
总结
此处说明Thymeleaf对于大小写的区分比较严格。一个是在SQL语句中无论大小写,返回到Mybatis中得到的列名都是小写,因此对应的了实体类也得吻合。其次在StackOverflow也注意到类似的问题:一个是关于
大小写问题
导致的同样的报错,但是他是在
th:fragment="fragment"
这样的字段中出现了错误;另一个是同样在
Model类定义的问题
,对字段没有设置
public
字段开放
set/get
也会有这样的报错问题。
参考文献