我想知道,为每个请求创建类似 messageResource 原型(prototype)(我猜也可能是单例)并填充请求的区域设置或从 session 中的用户对象获取的区域设置的最佳方法是什么。这样就不必传递 Locales,如果您不需要仅本地化验证消息,甚至不需要本地化异常消息等,那么这是非常不方便的。如果您有 2 个异常边界,那就是问题了。然后,必须传递对服务的引用或拥有一些聚合它们的上下文,并且所有操作都在一处完成。
由于其他原因,我已经扩展了 ResourceBundleMessageSource,因此它可能具有区域设置状态,但我不知道解决此问题的最佳方法是什么。
简短版本:当请求传递到处理程序时,从 session 中获取用户或区域设置,并从上下文中获取 CustomMessageSource 并填充它>在已本地化的 Controller 中提供相同的 CustomMessageSource 实例
当请求到来时,MessageSource 从 session 中自动“本地化”,您没有遇到问题吗?
应用程序上下文中的所有引用都将指向本地化的 messageResource。
@Autowired 私有(private) MessageSource 资源;
最佳答案
目前还没有对此进行开箱即用的支持,但您可以轻松地提出一个自定义组件,将 Locale
解析委托(delegate)给 LocaleResolver
,然后将解析调用依次委托(delegate)给 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();
}
}
如果将该组件注入(inject)到 Spring MVC Controller 中,您可以简单地解析消息,而无需通过 Controller 方法签名传递Locale
。我打开了JIRA ticket建议添加到 Spring 代码库中的增强功能。
关于java - Spring 的 messageResource 从 Session 隐式本地化 - 不必传递 Locale 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6796575/