NoSuchMessageException - Spring ReloadableResourceBundleMessageSource 与 ResourceBundleMessageSource

NoSuchMessageException - Spring ReloadableResourceBundleMessageSource vs ResourceBundleMessageSource

我定义了以下 Spring bean:

<bean id="messageSource" 
    class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list>
            <value>classpath:messages</value>
        </list>
    </property>
</bean>

控制器:

@Controller
public class EuserController {

    @Inject
    MessageSource messageSource;

    @RequestMapping(value="/euser/{empId}", method=RequestMethod.DELETE)
    public @ResponseBody String deleteEeuserById(@PathVariable(value="empId") Integer id) {
        return messageSource.getMessage("deleteEuser.success", null, LocaleContextHolder.getLocale());
    }
}

而且效果很好。但是当我尝试替换时:

org.springframework.context.support.ReloadableResourceBundleMessageSource

与:

org.springframework.context.support.ResourceBundleMessageSource

我得到了 org.springframework.context.NoSuchMessageException

改用 org.springframework.context.support.ResourceBundleMessageSource 会发生什么情况?

ReloadableResourceBundleMessageSource is an alternative to ResourceBundleMessageSource 能够在应用程序处于 运行 时刷新消息。它也更强大,因为您不仅限于 class 路径上的包,还可以从其他位置加载文件。

使用 ResourceBundleMessageSource 时,您需要在进行更改时重新启动您的应用程序,因为 ResourceBundleMessageSource 不会在您更改它们时重新加载您的包。 classpath: 前缀也需要删除。这是因为两个 classes 的工作方式:

  • ResourceBundleMessageSource 使用 JDK class 来做它的事情:ResourceBundle。它委托它加载包。基本上,您提供给 ResourceBundleMessageSource 的包必须符合 ResourceBundle 的期望和处理。 ResourceBundle 不知道如何处理 classpath: 前缀,因此失败。

  • 另一方面,
  • ReloadableResourceBundleMessageSource 是 "smarter" 并且知道如何从其他地方加载包,而不仅仅是 class 路径。它适用于 Spring class: Resource. There are various implementations out of the box. When you give a bundle to ReloadableResourceBundleMessageSource, since it can load files from various places, you have to be explicit with the location and say "My file is on the classpath". You say that by adding the classpath: prefix and Spring knows how to handle it.