Параметры перехватчика Struts2 и его жизненный цикл - PullRequest
0 голосов
/ 10 ноября 2011

мы используем Struts2 в нашем коде, и у меня есть сценарий, где мне нужно добавить пользовательский параметр для перехватчика.Я определил сеттер и геттер в перехватчике

public Collection<Class<?>> getGroups();
public void setGroups(String groupsString);

У меня в стеке определен перехватчик:

<interceptor-ref name="beanValidatorInterceptor">
    <param name="excludeMethods">*</param>
</interceptor-ref>

И я устанавливаю дополнительные параметры на уровне действия

<action name="...">
  <interceptor-ref name="loginRequired">
    <param name="beanValidatorInterceptor.includeMethods">execute</param>
    <param name="beanValidatorInterceptor.groups">com.company.MyGroup</param>
  </interceptor-ref>
  <result>some.jsp</result>
</action>

У меня есть одна проблема и один вопрос

  • Проблема: параметры групп не установлены (setGroups () не вызывается).Перехватчик вызывается, и методы includeMethods установлены.
  • Вопрос: знаете ли вы, что такое жизненный цикл перехватчика.Безопасно ли устанавливать includeMethods и группы на уровне действий.Другими словами, действия совместно используют один и тот же стек, но должны передавать разные параметры

1 Ответ

1 голос
/ 10 ноября 2011

Да и нет.Перехватчики похожи на сервлеты - существует только один экземпляр перехватчика. *

Обратите внимание, однако, что с вашим текущим определением, only перехватчик "loginRequired" определен для этого действия:- none других перехватчиков фреймворка будет запущено.Если вы объявляете <interceptor-ref> для действия, вы должны определить все перехватчики.

Из конфигурации выглядит так, как будто вы пытаетесь определить, какая группа может получить доступ к действию:эта информация должна храниться в действии , а не в перехватчике, поскольку это инструментируемое действие.

У вас есть несколько вариантов.Вы можете использовать перехватчик «staticParams» для установки информации о действии, вы можете определить и реализовать интерфейс для действия и включить метод, который получает разрешения для этого действия, или использовать аннотации для действия и опросить действие и /или метод действия в перехватчике.

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

* Фактически для каждого перехватчика-ref;может быть несколько экземпляров перехватчика, но только при явной ссылке в объявлении стека, и даже тогда будет только один экземпляр перехватчика, общий для запросов, проходящих через этот стек.

...