如何从 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
.
调用一个方法
我需要在宏中从 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
.