如何在自定义Velocity工具中加载/访问bean(@Resource)

时间:2009-09-24 18:35:15

标签: java spring velocity

我意识到这需要做一些有点时髦的事情,但我正试图从自定义Velocity工具访问我的Spring messageSource bean。

在我们的大多数代码库中,我只能设置一个成员变量并加载它:

@Resource(name = "messageSource")
private AbstractMessageSource _msgSource;

然而,在这种情况下,这不会加载bean,我假设因为Velocity工具以不允许发生正常bean加载的方式实例化。或者它不想为应用程序范围的Velocity工具初始化bean。

该工具在toolbox.xml中设置如下:

<tool>
    <key>calendarTool</key>
    <scope>application</scope>
    <class>...</class>
</tool>

我无法在网上找到任何解释如何执行此操作或解释为何无效的原因。

2 个答案:

答案 0 :(得分:0)

不确定为什么它不起作用,但您是否尝试在没有注释的情况下检索它,例如:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
AbstractMessageSource _msgSource = (AbstractMessageSource )ctx.getBean("messageSource");

答案 1 :(得分:0)

我所做的是在我渲染Velocity模板的代码中,我使用applicationContext.getBean(“messageSource”)从applicationContext检索消息源,然后我将MessageSource直接放入我使用的VelocityContext中在“messageSource”键下呈现我的模板:

VelocityContext velocityContext = new VelocityContext();
velocityContext.put("messageSource", applicationContext.getBean("messageSource"));

然后,无论何时我想呈现一个消息密钥,比如在HTML电子邮件中,它看起来像是:

<td>messageSource.getMessage("my.message.key", null, $locale)</td>

其中$ locale是一个java.util.Locale对象,我也手动放在VelocityContext中。如果我需要消息的任何参数,那么我使用我在上下文中放置的列表工具从我通常在模板中创建的参数列表中获取一个数组。作为旁注,您可以使用中的辅助方法 org.springframework.ui.velocity.VelocityEngineUtils类可以帮助您在控制器或Webflow代码中渲染Velocity模板,或者您可能在其他任何地方渲染模板。