使用Thymeleaf在JavaScript中循环Java对象列表

时间:2016-11-14 04:53:13

标签: javascript spring-boot thymeleaf

在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;
  • 如果我传递的用户列表没有国家,则会抓取JavaScript。
  • 如果我传递一个国家/地区列表并循环(单独测试Country类),它也可以。
  • 如果我传递的用户列表中我自己设置了国家/地区(未从数据库中获取),其值与数据库中包含的值相同,则可以正常运行
  • 如果我从数据库中检索国家/地区,然后将其设置为用户,则会失败。

所以看起来问题是因为Spring数据/ Hibernate以某种方式创建/映射到User实体,Thymeleaf无法对其进行反序列化...

1 个答案:

答案 0 :(得分:0)

JavaScript自然模板

你的课程路径中有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对象列表,可以将它映射到Java中的Json(使用像JacksonGson这样的库)然后添加它作为thymeleaf template的参数。

ObjectMapper mapper = new ObjectMapper();
String users =  mapper.writeValueAsString(users);
model.addAttribute("users", users);

参数的结果将采用JSON格式。