Thymeleaf报错Error resolving template [addlocation]问题排查
问题原因
这是Spring MVC整合Thymeleaf的默认视图解析规则导致的:
- 当控制器方法使用
@Controller注解、方法没有标注@ResponseBody、返回值为void时,Spring不会把方法的执行结果直接作为HTTP响应返回,而是会默认将当前请求的路径名作为视图名称,交给配置的视图解析器查找对应模板渲染。 - 你的
/addlocation接口完全符合上述特征:方法返回void、没有加@ResponseBody,业务逻辑(更新坐标、写入数据库)执行完成后,Thymeleaf会自动查找名为addlocation的模板文件,但你的templates目录下只有map.html,不存在addlocation.html,自然抛出模板不存在的错误。 - 你觉得功能运行正常,是因为报错发生在业务逻辑执行完毕后的视图渲染阶段,前面的坐标更新、入库逻辑已经正常跑完了,所以业务效果没受影响,但报错是真实存在的。
修复方案
不要修改类上的@Controller注解(否则你的/map页面接口会失效,无法返回Thymeleaf模板),只需要给addLocation方法加上@ResponseBody注解即可,这个注解会告诉Spring:当前方法不需要走视图解析流程,方法执行完直接返回响应即可,返回值为void时默认返回200状态码空响应。
修改后的接口代码:
@PostMapping("/addlocation") @ResponseBody public void addLocation(@RequestBody GpsMessage message) { if(message.getGpsTimestamp() == 0L) { bestLat = message.getTriLat(); bestLon = message.getTriLon(); } else { bestLat = message.getGpsLat() / divisor; bestLon = message.getGpsLon() / divisor; } DbConnection.writeLocation(message); }
额外提一句和当前报错无关的小问题:你map.html里的Thymeleaf行内JS变量没有写兜底默认值,一旦后端传参为空会直接触发JS语法错误,建议改成如下写法更稳妥:
<script th:inline="javascript"> var myLat = /*[[${latitude}]]*/ 0.0; var myLon = /*[[${longitude}]]*/ 0.0; </script>
内容的提问来源于stack exchange,提问作者Guy Fawkes
相关产品推荐
相关产品推荐

