NoSuchMessageException - Spring ReloadableResourceBundleMessageSource vs ResourceBundleMessageSource

时间:2015-01-10 16:27:42

标签: java spring

我定义了以下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

with:

org.springframework.context.support.ResourceBundleMessageSource

我得到了org.springframework.context.NoSuchMessageException

使用org.springframework.context.support.ResourceBundleMessageSource时会发生什么?

1 个答案:

答案 0 :(得分:9)

ReloadableResourceBundleMessageSourceResourceBundleMessageSource的替代方法,能够在应用程序运行时刷新消息。它也更强大,因为你不仅限于类路径上的bundle,但你也可以从其他位置加载文件。

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

  • ResourceBundleMessageSource使用JDK类来完成它的任务:ResourceBundle。它委托它来加载bundle。基本上,您提供给ResourceBundleMessageSource的包必须符合ResourceBundle期望和处理的内容。 ResourceBundle不知道如何处理classpath:前缀,因此失败。

  • 另一方面,
  • ReloadableResourceBundleMessageSource“更聪明”,并知道如何从其他地方加载捆绑,而不仅仅是类路径。它适用于Spring类:ResourceThere are various implementations out of the box。当您向ReloadableResourceBundleMessageSource提供一个包时,因为它可以从各个地方加载文件,您必须明确该位置并说“我的文件在类路径上”。 You say that by adding the classpath: prefix and Spring knows how to handle it