使用控制器模型变量和 Thymeleaf 动态调用 messages.properties

Posted

技术标签:

【中文标题】使用控制器模型变量和 Thymeleaf 动态调用 messages.properties【英文标题】:Calling messages.properties dynamically with controller model variable and Thymeleaf 【发布时间】:2020-07-23 12:21:36 【问题描述】:

我的 messages.properties 是这样的:

tablas.menu.paises=Pa\u00EDses
tablas.menu.regiones=Regiones
tablas.menu.anhos=A\u00F1os
tablas.menu.universidades=Universidades
tablas.menu.usuarios=Usuarios

.html 中,我有一个菜单,其中包含 th:each:

<li class="nav-item" th:each="menu : $menus">
  <a th:text="#tablas.menu.$menu.nombre"></a>
</li>

对于每个“$menus 中的菜单”,menu.nombre 具有值 paises、regiones、anhos... 但是 thymeleaf 无法识别 # 中的模型变量,当它没有找到消息时,它在视图中给了我错误:

??tablas.menu.$menu.nombre_es_ES??

配置没问题,如果我更改 #tablas.menu.regiones 的调用,我会得到“区域”等。 有没有办法使用这样的模型变量动态地从 messages.properties 调用消息?

谢谢。

【问题讨论】:

试试 Thymeleaf preprocessor。因此,例如:_$menu.nombre_. 该死的,非常感谢,我不知道这个功能,它可以工作。 th:text="#tablas.menu.__$menu.nombre__" 工作完美。 感谢您纠正我的错字 - 下划线是必需的,而不是单打。 【参考方案1】:

您可以为此使用#messages utility object:

<a th:text="$#messages.msg('tablas.menu.' + menu.nombre)" />

或者您可以使用literal substitution 创建字符串:

<a th:text="#|tablas.menu.$menu.nombre|" />

我建议仅将预处理作为最后的手段,因为错误的值会导致运行时错误。 (尽管他们确实为此工作。)

【讨论】:

以上是关于使用控制器模型变量和 Thymeleaf 动态调用 messages.properties的主要内容,如果未能解决你的问题,请参考以下文章

从 Thymeleaf 调用并加载 Spring MVC 控制器请求方法

「SpringBoot实战」视图技术-Thymeleaf

IntelliJ中的Spring boot + thymeleaf:无法解析变量

使用 Thymeleaf 从 Spring 模型设置 JavaScript 变量

使用片段时 Intellij 无法正确识别 Thymeleaf 模型变量

(Spring,Thymeleaf)如何使用模型内的模型列表向控制器“POST”请求?