在Spring Boot项目中,我有一个用户列表,用Java List<User>
我将它从Controller传递给模板,我可以使用HTML列表ul
遍历此列表,但我无法在JavaScript中执行此操作:
<script layout:fragment="script" th:inline="javascript">
/*<![CDATA[*/
var users = /*[[${users}]]*/ [];
for (var i = 0; i < users.length; i++) {
console.log(i); // Obviously here I would like to access the User properties
}
/*]]>*/
</script>
我收到此错误:
Error during execution of processor
'org.thymeleaf.standard.processor.text.StandardTextInliningTextProcessor'
我们如何使用Thymeleaf遍历列表并在JavaScript中访问Java对象属性? 感谢。
编辑:到目前为止我发现了
My User类是具有Country属性的JPA实体(Country是另一个JPA实体):
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "country_id")
private Country country;
所以看起来问题是因为Spring数据/ Hibernate以某种方式创建/映射到User实体,Thymeleaf无法对其进行反序列化...
答案 0 :(得分:0)
你的课程路径中有Jackson library
吗?
如果你拥有它,它应该工作。
如果您看一下reference documentation它的工作原理:
关于JavaScript内联的一个重要注意事项就是这个 表达式评估是智能的,不仅限于字符串。 Thymeleaf将正确编写以下JavaScript语法 各种物体:
字符串......
$ {session.user}表达式将评估为User对象,Thymeleaf将正确地将其转换为Javascript语法
至少,其他方式如果需要,配置如何使用StandardDialect
的实例完成序列化:
这种JavaScript序列化的方式是通过 实施 org.thymeleaf.standard.serializer.IStandardJavaScriptSerializer 接口,可以在。的实例配置 在模板引擎中使用StandardDialect。
正如我之前所说,你Jackson Library
中应该有classpath
(虽然参考文献说我会添加类似的结果):
这个JS序列化机制的默认实现将 在类路径中查找杰克逊库,如果存在,将会 用它。如果没有,它将应用内置的序列化机制 涵盖大多数情景的需要并产生类似的结果(但是 不太灵活。)
最后,尝试记录users
内容(console.log(users)
)以查看正在进行序列化的内容。
其他更简单的方法是如果要迭代一个java对象列表,可以将它映射到Java中的Json
(使用像Jackson
或Gson
这样的库)然后添加它作为thymeleaf template
的参数。
ObjectMapper mapper = new ObjectMapper();
String users = mapper.writeValueAsString(users);
model.addAttribute("users", users);
参数的结果将采用JSON格式。