Spring Boot集成Thymeleaf:消息表达式取值与默认值设置问题
解决Thymeleaf动态消息键回退到默认值的问题
嗨,我来帮你搞定这个问题!你的核心需求是:根据operator_id拼接动态消息键,如果这个键存在就显示对应值,否则回退到默认的消息值,同时避免出现??xxx??的占位符。
问题根源
你当前的写法里,#{label.btn.unsubscribe+'_'+${operator_id}}这个表达式有个关键问题:当Thymeleaf找不到对应的消息键时,它不会返回null或者空值,而是直接输出??label.btn.unsubscribe_com??这类占位符字符串。这就导致你的三元判断A ? A : B永远会走A分支,因为A永远是非空的,自然达不到回退到默认值的效果。
解决方案:使用#messages.msgOrNull()方法
Thymeleaf提供了#messages.msgOrNull()工具方法,它的特性是:如果找到对应的消息键就返回值,找不到则返回null。配合Thymeleaf的Elvis运算符?:(相当于简化的三元表达式),就能完美实现你的需求。
修改后的代码如下:
<th:block th:replace="fragments/header :: nav-header-back-text( header_txt= ${#messages.msgOrNull('label.btn.unsubscribe_' + operator_id)} ?: #{label.btn.unsubscribe} )"></th:block>
代码解释
- 首先拼接动态消息键:
'label.btn.unsubscribe_' + operator_id,当operator_id为com时,就会生成label.btn.unsubscribe_com。 - 用
#messages.msgOrNull()尝试获取这个动态键的消息值:- 如果该键存在,就返回对应的消息文本;
- 如果不存在,返回
null。
- Elvis运算符
?:会判断左边的值:如果左边是null(也就是动态键不存在),就使用右边的#{label.btn.unsubscribe}默认值;否则使用左边的动态消息值。
额外优化(可选)
如果operator_id可能为空,你可以再加一层判断,避免生成无效的消息键(比如label.btn.unsubscribe_):
<th:block th:replace="fragments/header :: nav-header-back-text( header_txt= ${operator_id != null ? #messages.msgOrNull('label.btn.unsubscribe_' + operator_id) : null} ?: #{label.btn.unsubscribe} )"></th:block>
这样不管operator_id是否存在,都能保证最终显示的是有效消息值,不会出现占位符啦!
内容的提问来源于stack exchange,提问作者Vicky Rathee
相关产品推荐
相关产品推荐

