Spring 的消息资源从会话隐式本地化 - 不必传递区域设置引用



我想知道,为每个请求创建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代码库进行增强。

相关内容

  • 没有找到相关文章

最新更新