Наше приложение использует 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, как я могу это сделать?
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);
}
}
// ...
В моем примере выше "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();
}
}
ActionContext.getContext().getSession() != null
и при запуске сервера используйте язык по умолчанию.