Thymeleaf模板中获取Locale时SpringEL表达式报错问题
解决Thymeleaf中Locale比较的报错问题
错误原因分析
你当前的代码存在两个核心问题引发报错:
- 类型不匹配:
LocaleContextHolder.getLocale()返回的是Locale对象,直接用==和字符串(如'es')做相等判断,Spring EL无法处理不同类型的比较逻辑,因此抛出表达式解析异常。 - 表达式笔误:最后一个English选项的
th:selected表达式错误地写为${LocaleContextHolder.getLocale()=='pt'},应当对应'en'。
另外,直接在模板中调用LocaleContextHolder并非Thymeleaf的最佳实践,框架提供了更便捷的内置对象可直接使用。
修复后的代码
使用Thymeleaf内置的#locale对象获取当前Locale,调用getLanguage()方法得到语言代码后再与目标字符串比较:
<select th:id="language-picker-select" name="language-picker-select"> <option th:value="es" th:selected="${#locale.language == 'es'}">Español</option> <option th:value="fr" th:selected="${#locale.language == 'fr'}">Français</option> <option th:value="pt" th:selected="${#locale.language == 'pt'}">Português</option> <option th:value="en" th:selected="${#locale.language == 'en'}">English</option> </select>
补充说明
#locale是Thymeleaf提供的内置上下文对象,直接指向当前请求的Locale,无需手动调用Spring的LocaleContextHolder,更符合模板简洁性要求。- 如果需要匹配包含国家代码的完整Locale(如
es-ES),可以使用#locale.toString()获取完整Locale字符串进行比较。
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

