【问题标题】:Looping through a list of Java objects in JavaScript with Thymeleaf使用 Thymeleaf 循环遍历 JavaScript 中的 Java 对象列表
【发布时间】:2017-03-27 16:42:35
【问题描述】:

在 Spring Boot 项目中,我有一个用户列表,使用 Java List<User>
我将它从控制器传递到模板,我可以使用 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 对象属性?
谢谢。

编辑:到目前为止我发现了什么

我的 User 类是具有 Country 属性的 JPA 实体(Country 是另一个 JPA 实体):

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "country_id")
private Country country;
  • 如果我传递没有国家/地区的用户列表,则获取 JavaScript 作品。
  • 如果我传递一个国家列表并循环遍历(以自行测试 Country 类),它也可以工作。
  • 如果我传递了一个用户列表,在该列表中我自己设置了国家(不是从数据库中获取)与数据库包含的值相同,它可以工作
  • 如果我从数据库中检索国家/地区,然后将其设置给用户,则会失败。

所以问题似乎是因为国家实体是由 Spring Data/Hibernate 以某种方式创建/映射到用户的,Thymeleaf 无法反序列化它......

【问题讨论】:

  • 尝试探索ajax

标签: javascript spring-boot thymeleaf


【解决方案1】:

JavaScript 自然模板

你的类路径中有Jackson library吗?

如果你有它,它应该可以工作。

如果你看一下reference documentation,它就像你正在做的那样工作:

关于 JavaScript 内联需要注意的重要一点是, 表达式评估是智能的,不限于字符串。 Thymeleaf 将在 JavaScript 语法中正确编写以下内容 对象种类:

字符串 ...

${session.user} 表达式将评估为 User 对象,Thymeleaf 将正确地将其转换为 Javascript 语法

至少,如果您愿意,可以通过其他方式配置如何使用StandardDialect 的实例完成序列化:

这个 JavaScript 序列化的方式是通过一个 的实施 org.thymeleaf.standard.serializer.IStandardJavaScriptSerializer 接口,可以在实例中配置 模板引擎中使用的 StandardDialect。

正如我之前所说,您的 classpath 中应该有 Jackson Library(尽管参考资料说它会有类似的结果,但我会添加它):

这个JS序列化机制的默认实现会 在类路径中查找 Jackson 库,如果存在,将 用它。如果不是,它将应用内置的序列化机制 涵盖大多数场景的需求并产生类似的结果(但 不太灵活)。

最后,尝试记录users 内容(console.log(users)),看看是什么在进行序列化。

Java 映射

其他更简单的方法是,如果你想迭代一个 java 对象列表,你可以将它映射到 Java 中的 Json(使用像 JacksonGson 这样的库),然后将它作为参数添加到 @ 987654331@.

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

参数的结果将是 JSON 格式。

【讨论】:

  • 我已经在类路径中有 Jackson 数据绑定和核心库。问题是我使用 Map&lt;String, Object&gt; model 将数据从控制器传递到模板,在其中我放了 model.put("users", users) 你告诉我我必须用 ObjectMapper 序列化地图(或其内容)吗?
  • 我说你可以序列化users。因此,一旦序列化为 JSON,您将添加 model.put("users", users")。它应该可以工作,但实际上这不是好方法。
  • 是的,这就是我所理解的,而且我确实不想序列化我放入模型中的所有内容。我真的很想念JSP/JSTL...
  • 我编辑了这个问题,这显然是一个 JPA 问题
猜你喜欢
  • 2015-06-27
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2013-05-29
  • 2019-12-11
相关资源
最近更新 更多