在您展示的具体案例中,也许您应该只写
<#if myBoolean><@spring.messageText ...><#else><@spring.messageText ...></#if>
如果经常需要,那就做一个#macro。
在更一般的情况下,问题是您不能从表达式中调用宏(或指令),Spring 也应该提供一个函数变体message。我不知道 Spring MVC,但是看着spring.ftl,似乎springMacroRequestContext.getMessage(code, text)应该可以解决这个问题。但这很冗长,所以您可能想创建一个/lib/springutils.ftl内容如下:
<#function message code text=''>
<#if text != ''>
<#return springMacroRequestContext.getMessage(code, text)>
<#else>
<#return springMacroRequestContext.getMessage(code)>
</#if>
</#function>
然后在您的模板中:
<#import "/lib/springutils.ftl" as su>
${myBoolean?string(su.message(...), su.message(...))}
但是,请注意,如果您使用 打印一个值${...},它会受到#escape(当然,如果您使用它)的影响,而如果您使用 打印一些东西<@...>,它永远不会转义(作为<@...>/<#...>意味着打印标记)。因此,如果您的消息包含 HTML,${...}那么您最终可能会按字面意思为用户显示 HTML 标记(如<将转义到<等等)。除非,你写<#noescape>${...}</#noescape>.
(转义更新:FreeMarker 2.3.24 支持不带 的自动转义#escape,你可以使用${su.message(...)?no_esc}。更好的是,如果你在message函数内部知道消息是 HTML,你可以使用<#return springMacroRequestContext.getMessage(...)?no_esc>,然后只写${su.message(...)},FreeMarker 不会加倍-逃脱它。)