我定义了以下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
时会发生什么?
答案 0 :(得分:9)
ReloadableResourceBundleMessageSource
是ResourceBundleMessageSource
的替代方法,能够在应用程序运行时刷新消息。它也更强大,因为你不仅限于类路径上的bundle,但你也可以从其他位置加载文件。
使用ResourceBundleMessageSource
时,您需要在进行更改时重新启动应用程序,因为ResourceBundleMessageSource
在更改时不会重新加载您的软件包。还需要删除classpath:
前缀。这是因为这两个类的工作方式:
ResourceBundleMessageSource
使用JDK类来完成它的任务:ResourceBundle
。它委托它来加载bundle。基本上,您提供给ResourceBundleMessageSource
的包必须符合ResourceBundle
期望和处理的内容。 ResourceBundle
不知道如何处理classpath:
前缀,因此失败。
ReloadableResourceBundleMessageSource
“更聪明”,并知道如何从其他地方加载捆绑,而不仅仅是类路径。它适用于Spring类:Resource
。 There are various implementations out of the box。当您向ReloadableResourceBundleMessageSource
提供一个包时,因为它可以从各个地方加载文件,您必须明确该位置并说“我的文件在类路径上”。 You say that by adding the classpath:
prefix and Spring knows how to handle it