java - Spring 的 messageResource 从 Session 隐式本地化 - 不必传递 Locale 引用

标签 java spring-mvc localization requesthandler

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

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

简短版本:当请求传递到处理程序时,从 session 中获取用户或区域设置,并从上下文中获取 CustomMessageSource 并填充它>在已本地化的 Controller 中提供相同的 CustomMessageSource 实例

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

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

@Autowired 私有(private) MessageSource 资源;

您可以投票SPR-8555对于 servlet 环境和 SPR-8558用于 Portlet 环境。

最佳答案

目前还没有对此进行开箱即用的支持,但您可以轻松地提出一个自定义组件,将 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/

相关文章:

Java 类型删除和重载?

asp.net-mvc - 使用基于 SQL 的本地化提供程序时,如何本地化/国际化 MVC Controller ?

Android 本地化不适用于某些语言

asp.net-mvc - 如何在 ASP.NET MVC 中使用已编译的全局资源

java - 无法在 Mac OS Catalina 上编辑 .profile

java - 在运行 Spring MVC 应用程序时在 Spring Boot 中获取 NoSuchMethodError : javax. servlet.ServletContext.addServlet

java - 如何在 Spring 中使用 @autowired 标签在子对象之间切换?

java - 数据表 url 中输入的动态值

java - 无法从另一个 JFrame 在 JTextField 中 setText()

java - 如何使用 REST API 发布 Yammer 民意调查?