SpringR messageResource неявно локализован из Session - не нужно передавать ссылку на локаль - PullRequest
1 голос
/ 23 июля 2011

Мне интересно, каков наилучший способ создать что-то вроде прототипа messageResource (может быть, тоже singleton), созданного для каждого запроса и заполненного локалью запроса или локалью, полученной из объекта User в сеансе.Так что не нужно передавать Locales, что очень неудобно, если вам не нужно локализовать только сообщения проверки, но даже сообщения об исключениях и т. Д. Если у вас есть 2 границы исключений, это проблема.Затем нужно передать ссылки на сервисы или иметь некоторый контекст, который объединяет их, и все это делается в одном месте.

У меня уже есть ResourceBundleMessageSource, расширенный по другим причинам, поэтому он может иметь состояние локали, но я нене знаю, как лучше всего подойти к этой проблеме.

SHORTER VERSION: когда запрос передается в обработчик, захватывает User или Locale из Session, получает CustomMessageSource из контекста и заполняет его>, чтобы тот же экземпляр CustomMessageSource был доступен вКонтроллер уже локализован

У вас нет проблем с тем, что MessageSource автоматически "локализуется" из сеанса при поступлении запроса?

Все ссылки в контексте приложения будут указывать на локализованный messageResource.

@ Частный источник сообщений с автоматической связью;

Вы можете проголосовать SPR-8555 за среду сервлета и SPR-8558 за среду портлета.

1 Ответ

1 голос
/ 23 июля 2011

Прямо сейчас нет встроенной поддержки для этого, но вы можете легко придумать пользовательский компонент, который делегирует разрешение 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.

...