Доступ к локали Struts2 в Spring AbstractRoutingDataSource

1

Наше приложение использует Struts2-интернализацию и Spring AbstractRoutingDataSource для динамических изменений базы данных. При изменении языка необходимо выбрать соответствующую базу данных языков.

Таким образом, приведенный ниже код делает выбор динамической базы данных с использованием Spring RoutingDataSource.

public class RoutingDataSource extends AbstractRoutingDataSource {
    protected Object determineCurrentLookupKey() {
        return LanguageContextHolder.getLanguagetype();
    }
}

Spring RoutingDataSource работает нормально.

Моя проблема заключается в том, как установить языковой стандарт при изменении. Поскольку он хранится в Struts2, я не могу получить к нему доступ весной.

Я нашел Spring MVC org.springframework.context.i18n.LocaleContextHolder бы это, но так как мы используем Struts2, как я могу это сделать?

Теги:
spring
struts2

2 ответа

0
Лучший ответ

Struts2 сохраняет текущую локаль в сеансе с ключом по умолчанию WW_TRANS_I18N_LOCALE. Для доступа к сеансу внутри вашего RoutingDataSource используйте ActionContext.getContext().getSession().

// ...

if (ActionContext.getContext() != null) {
  Map<String, Object> session = ActionContext.getContext().getSession();

  if (session != null && session.containsKey(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE)) {
    Locale locale = (Locale) session.get(I18nInterceptor.DEFAULT_SESSION_ATTRIBUTE);
  }
}

// ...
  • 0
    @ Александр - источник данных маршрутизации вызывается во время запуска сервера. Итак, я получаю исключение нулевого указателя при вызове, Map <String, Object> session = ActionContext.getContext (). GetSession ();
  • 0
    @SivaranjaniD: добавьте дополнительную проверку ActionContext.getContext().getSession() != null и при запуске сервера используйте язык по умолчанию.
Показать ещё 7 комментариев
0

В моем примере выше "return LanguageContextHolder.getLanguagetype();" вернет тип ThreadLocal. И это реализовано, как показано ниже.

public class LanguageContextHolder implements Serializable {    

private static ThreadLocal<LanguageType> languageType = new ThreadLocal<LanguageType>();

public static ThreadLocal<LanguageType> getLanguagetype() {
    return languageType;
}

public static void setLanguagetype(ThreadLocal<LanguageType> languagetype) {
    languageType = languagetype;
}

public static void clearLanguageType() {
    languageType.remove();
}

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню