我想知道,为每个请求创建messageResource(可能是单例)的原型并使用请求的Locale或会话中从用户对象获得的Locale填充的最佳方法是什么。这样就不需要传递locale,如果你不需要只本地化验证消息,甚至不需要本地化异常消息等等,这是非常不方便的。如果你有两个异常边界,那就是问题了。然后必须将引用传递给服务,或者有一些聚合它们的上下文,所有这些都在一个地方完成。
由于其他原因,我已经扩展了ResourceBundleMessageSource,所以它可以具有locale状态,但我不知道解决这个问题的最佳方法是什么。
更短的版本:当请求被传递到处理程序时,从会话中抓取用户或区域,从上下文中获取CustomMessageSource并填充它>在控制器中已经本地化的CustomMessageSource实例可用
当请求来临时,MessageSource自动从会话"本地化",您没有问题吗?
应用上下文中的所有引用都指向本地化的messageResource。
@ autowiredprivate MessageSource资源;
您可以投票为servlet环境选择sr -8555,为Portlet环境选择sr -8558。
目前还没有现成的支持,但你可以很容易地想出一个自定义组件,将Locale
的分辨率委托给LocaleResolver
,并依次将分辨率调用委托给MessageSource
:
public class LocalizedMessageSource {
private final MessageSource messageSource;
private final LocaleResolver localeResolver;
public LocalizedMessageSource(MessageSource messageSource,
LocaleResolver localeResolver) {
Assert.notNull(messageSource);
Assert.notNull(localeResolver);
this.messageSource = messageSource;
this.localeResolver = localeResolver;
}
public String getMessage(MessageSourceResolvable resolvable) {
return messageSource.getMessage(resolvable, getLocale());
public String getMessage(String code, Object[] args) {
return messageSource.getMessage(code, args, getLocale());
getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
return messageSource.getMessage(code, args, defaultMessage, getLocale());
}
private Locale getLocale() {
return localeResolver.resolveLocale(getCurrentRequest());
}
private HttpServletRequest getCurrentRequest() {
return ((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes()).getRequest();
}
}
如果您将该组件注入到Spring MVC控制器中,您可以简单地解析消息,而无需通过控制器方法签名的Locale
管道。我已经打开了一个JIRA票据,建议对Spring代码库进行增强。