Как установить локаль в пользовательском Struts 2 ActionMapper

Я реализовал собственный ActionMapper, который получает локаль из URI (сам URI, а не параметры запроса). Из ActionMapper.getMapping(), как мне установить локаль для текущего действия?

Вот некоторые идеи, которые я рассмотрел:

  • ActionContext.getCurrent().setLocale(). К сожалению, кажется, что новый новый ActionContext создается при вызове действия, а языковой стандарт сбрасывается до значения по умолчанию.
  • Установите параметр request_locale, который будет обрабатываться перехватчиком i18n. К сожалению, перехватчик i18n настаивает на установке языкового стандарта не только для текущего действия, но и для текущего сеанса, что вызывает исключение, поскольку сеансы не включены для моего приложения.
  • Установите параметр и обработайте его в самом действии, реализуя setLocale(). Прямолинейно, но это означает, что ни один из перехватчиков не будет иметь доступа к локали.
  • Установите параметр и напишите перехватчик (чтобы в основном делать то же самое, что и перехватчик i18n, но без поддержки сеанса). Кажется излишним для такой простой проблемы, не говоря уже о том, чтобы заново изобретать велосипед.

Есть ли простой способ добиться этого?


person Todd Owen    schedule 18.08.2009    source источник
comment
Если вам нужна локаль во всех ваших перехватчиках, я думаю, вы застряли, заново изобретая колесо с помощью специального перехватчика i18n. Я удивлен, что ActionContext воссоздан - я подумал, что ваша первая идея тоже сработала бы.   -  person Pat    schedule 19.08.2009


Ответы (2)


вы можете использовать предоставленный I18nInterceptor при установке параметра: request_only_locale

вместо request_locale

request_only_locale хранит локаль только для запросов и не затрагивает сеанс.

Привет, Кристиан

person Christian    schedule 20.04.2011
comment
Хорошее решение. Я предполагаю, что это не было доступно в любой версии Struts2, которую я использовал в то время, когда задал исходный вопрос (поскольку я уверен, что просмотрел источник I18nInterceptor). - person Todd Owen; 21.04.2011

Я действительно установил параметр «locale» и переписал перехватчик i18n, чтобы использовать его.

Начиная с Struts 2.1.1, параметры в ActionMapping хранятся отдельно от параметров запроса. Перехватчик actionMappingParams принимает эти параметры и применяет их к объекту действия. Однако я хотел, чтобы мой перехватчик i18n использовал параметры «локали» и не передал их действию. Вот как я это сделал:

private static final String LOCALE_PARAMETER = "locale";

public String intercept(ActionInvocation invocation) throws Exception {
    ActionMapping mapping = (ActionMapping) invocation.getInvocationContext()
        .get(ServletActionContext.ACTION_MAPPING);
    Map params = mapping.getParams(); 
    Locale locale = (Locale) params.remove(LOCALE_PARAMETER);

    if(locale != null) {
        ActionContext.getContext().setLocale(locale);
    }

    return invocation.invoke();
}

Этот пользовательский перехватчик i18n должен располагаться перед actionMappingParams в стеке перехватчиков.

person Todd Owen    schedule 01.09.2009