1

我想知道,为每个请求创建类似 messageResource 原型(我猜也可能是单例)并填充请求的 Locale 或从会话中的 User 对象获取的 Locale 的最佳方法是什么。这样就不必传递区域设置,如果您不需要仅本地化验证消息甚至异常消息等,这是非常不方便的。如果您有 2 个异常边界,那么问题就来了。然后必须传递对服务的引用或有一些聚合它们的上下文,所有这些都在一个地方完成。

由于其他原因,我已经扩展了 ResourceBundleMessageSource,因此它可能具有区域设置状态,但我不知道解决此问题的最佳方法是什么。

更短的版本:当请求被传递给处理程序时,从 Session 中获取 User 或 Locale 并从上下文中获取 CustomMessageSource 并填充它 > 在 Controller 中具有相同的 CustomMessageSource 实例已经本地化

当请求到来时,MessageSource 从会话中自动“本地化”没有问题吗?

应用上下文中的所有引用都将指向本地化的 messageResource。

@Autowired 私有 MessageSource 资源;

您可以投票支持 servlet 环境的SPR-8555和 Portlet 环境的 SPR-8558

4

1 回答 1

1

目前还没有开箱即用的支持,但是您可以轻松地提出一个自定义组件,将Locale解析委托给 aLocaleResolver并将解析调用委托给 a 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 代码库中添加增强功能。

于 2011-07-23T11:40:59.290 回答