Параметры перехватчика Struts2 и его жизненный цикл

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

person szympans    schedule 10.11.2011    source источник
comment
loginRequired — это стек, содержащий beanValidatorInterceptor.   -  person szympans    schedule 10.11.2011


Ответы (1)


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

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

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

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

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

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

person Dave Newton    schedule 10.11.2011
comment
* Итак, если я перехватываю стек для каждого действия, есть экземпляр стека для каждого действия. 2 действия, 2 экземпляра стека (каждый перехватчик определен) - person szympans; 10.11.2011
comment
@szympans Правильно. Но я считаю, что данные, относящиеся к действию, должны быть в действии, а не в перехватчике, что также упрощает/уменьшает конфигурацию. - person Dave Newton; 10.11.2011
comment
Хорошо, я рассмотрю ваше предложение. Мне нравится, как работает MethodFilterInterceptor... Спасибо за разъяснение. - person szympans; 10.11.2011
comment
@szympans Тогда я бы рассмотрел либо аннотации на уровне метода, либо соглашения о методах на основе имен. Для методов у вас может быть метод с именем executeAccess, который, например, определяет права доступа для метода execute. Перехватчик увидит, какой метод вызывается, увидит, есть ли соответствующий метод доступа, и вызовет его, если он есть. - person Dave Newton; 10.11.2011