如何从 freemarker 宏中的上下文中获取 spring bean?

How to get spring bean from context in freemarker macros?

我需要在宏中从 WebApplicationContext 获取 spring bean。 我的尝试是执行以下操作:

<#macro categoryName category>
    <#assign context=springMacroRequestContext.webApplicationContext>
    <#assign lb=context.getBean("localizationBean")/>
    <#assign pp=context.getBean("phraseProvider")/>
    <#assign categoryName=pp.getPhrase(lb.getCategoryMnemo(category))/>
    ${categoryName}
</#macro>

但是这是失败的。首先,如果我提供一个 bean 名称,它是一个字符串 getBean 它 returns 一个我必须以某种方式转换的对象,我也尝试提供完全限定的 class 名称但是freemarker 不喜欢它。那么怎么做呢?

我对这个问题的解决方案是从控制器传递一个 bean,然后在宏中使用它。

此外,如果您的域中有例如 User 实体,我建议您创建一个相关的宏文件,例如 user-macroses.ftl,其中放置所有与用户相关的宏文件。

并且如果在某些宏中您需要调用一些 spring bean 方法,您应该创建一个类似 UserFtlMacroses 的 bean 来放置与用户相关的逻辑,因此在视图中调用一些宏 <@user.doSomething/>doSomething 将从 UserFtlMacroses.

调用一个方法