关于Thymeleaf框架的TemplateInputException解决方法

  • Post author:
  • Post category:其他




关于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">&#xe642;</i>
                    </a>
                    <a title="删除" onclick="" href="javascript:;">
                        <i class="layui-icon">&#xe640;</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

也会有这样的报错问题。



参考文献


  1. StackOverFlow大小写问题

  2. StackOverFlow实体类定义问题



版权声明:本文为qq_41205651原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。