【问题标题】:How to Inject Spring ReloadableResourceBundleMessageSource如何注入 Spring ReloadableResourceBundleMessageSource
【发布时间】:2009-04-08 03:47:12
【问题描述】:

为了以编程方式刷新资源包缓存,我使用了 Spring 的 ReloadableResourceBundleMessageSource。我无法将它注入到我想要调用 clearCache() 方法的 bean 中。

我不得不采取以下措施:

private ReloadableResourceBundleMessageSource messageSource;

@Autowired
public void setMessageSource(MessageSource messageSource) {
  this.messageSource = (ReloadableResourceBundleMessageSource((DelegatingMessageSource)messageSource).getParentMessageSource();
}

这可行,但必须有更好的方法。消息资源定义如下:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames" >
<list>
   <value>WEB-INF/content/Content</value>
 </list>
 </property>
</bean>

我不明白为什么 Spring 会注入 DelegatingMessageSource 类型的消息源。

【问题讨论】:

    标签: spring


    【解决方案1】:

    我认为在这种情况下按类型自动装配不会起作用,因为自动装配候选者很可能是 ApplicationContext 本身(参见参考文档的 section 3.8.2)。这会导致您必须挖掘所有这些层才能获得原始ReloadableResourceBundleMessageSource

    尝试通过 XML 配置传递对 messageSource bean 的引用。使用 @Qualifier('messageSource') 注释属性也应该可以。

    【讨论】:

    • 我已经尝试通过 XML 配置连接 bean,但我得到了相同的结果。我还没有尝试过@Qualifier。我会试一试的。谢谢。
    • 按名称自动装配,这是@Qualifier 的后备方法,在这种情况下也无济于事。将 元素与 MessageSource 定义 (static.springframework.org/spring/docs/2.5.x/reference/…) 一起使用可能会成功。
    • 或者,让您的 MessageSource 客户端 ApplicationContextAware 并以编程方式访问“messageSource”bean。
    • 正如 springify 所指出的,如果你有一个@autowired MessageSource,那么 Spring 将始终为你提供对应用程序上下文自己的内部 MessageSource 的引用,该引用委托给它可能找到的任何其他消息源。如果你不想要这个,那么完全删除 @autowired 注释,并手动注入你的 MessageSource bean。不要乱用@Qualifier之类的,没必要那么复杂。
    【解决方案2】:

    当 Spring 找不到定义的“messageSource”时,通常会注入 DelegatingMessageSource。你确定你正确地定义了它或者它在必要时是可见的吗?我认为这里的问题是如何设置 XML 配置。

    我在 Spring Web Flow 和表单操作方面遇到了类似的情况。在我的 XML 配置中,“messageSource”不可见,导致 DelegatingMessageSource 被注入。我将“messageSource”bean 定义放入 webflow 配置中,然后一切正常,我停止获取 DelegationMessageSource 对象。然而,这是一个丑陋的修复,因为现在我在两个地方定义了“messageSource”。

    不管怎样,这个问题是在我切换到 Spring 2.5.6 之后才开始出现的。我正在使用 Webflow 1。一旦有机会,我将尝试更新到 Webflow 2,看看会发生什么。也许这会解决问题。

    【讨论】:

      【解决方案3】:

      您是否尝试将方法定义为:

      public void setMessageSource(ReloadableResourceBundleMessageSource messageSoure) {
          this.messageSoure = messageSoure;
      }
      

      【讨论】:

      • 是的,这是我第一次做的,但初始化失败,出现关于找不到 ReloadableResourceBundleMessageSource 类型的 bean 的错误。
      【解决方案4】:

      当您尝试在控制器中通过messageSource 运行它时,您会得到任何东西,空字符串。如果你仔细观察,你会发现你的 messageSource 属性中有一个DelegatingMessageSource,父源为空,这意味着它是 EMPTY,即总是返回空白,并且这个异常发生在控制器中

      ReloadableResourceBundleMessageSource incompatible with org.springframework.context.support.DelegatingMessageSource
      

      Read more..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-08
        • 2013-12-08
        • 2012-04-27
        • 1970-01-01
        • 2017-12-24
        • 2012-02-20
        • 1970-01-01
        • 2021-07-07
        相关资源
        最近更新 更多