Кто вызывает метод перехвата перехватчика в Struts 2

Я работал с перехватчиками Struts2, контейнер создает прокси-сервер Action для соответствующего класса действий после консультации с менеджером конфигурации (struts.xml). Теперь пришло время выполнить цепочку перехватчиков, у меня простой вопрос — кто именно вызывает метод перехвата в классе Myinterceptor.

public class MyInterceptor  implements Interceptor{

    public void destroy() {
        // TODO Auto-generated method stub

    }

    public void init() {
        // TODO Auto-generated method stub

    }

    public String intercept(ActionInvocation ai) throws Exception {
        // TODO Auto-generated method stub
        long t1=System.currentTimeMillis();

        ValueStack s= ai.getStack();
        String val=s.findString("name");
        s.set("name", val.toUpperCase()+"_changed");

        return ai.invoke();

    }

}

Насколько я понимаю, он вызывается actionproxy соответствующего класса действий, в тех же строках это делается в Spring AOP, где proxyfactorybean делает то же самое, чтобы вызывать советы для класса (pointcut).

Но у меня нет документации, подтверждающей это. Подскажите пожалуйста прав я или нет.


person jayendra bhatt    schedule 07.03.2015    source источник
comment
Привет! если вы нашли ответ правильным, пожалуйста, примите ответ.   -  person Kanti    schedule 16.03.2015


Ответы (3)


Класс ActionInvocation

  1. Платформа сначала вызывает метод invoke() ActionInvocation, чтобы начать выполнение Action.

  2. ActionInvocaton запускает процесс вызова, выполняя первый перехватчик в стеке.

person Kanti    schedule 09.03.2015

Ваш перехват должен переопределить метод intercept() интерфейса Interceptor. Просто добавьте аннотацию @Override к вашему методу.

@Override
public String intercept(ActionInvocation ai) throws Exception {
   //your code
}
person festimk    schedule 11.06.2015
comment
Это не отвечает на вопрос ОП. А аннотация @Override — это всего лишь маркер. - person Aleksandr M; 11.06.2015
comment
После создания перехватчика в интерфейсе Interceptor вызывается метод init. Затем init вызывает перехват. Но чтобы вызвать перехватчик вашего метода, вы должны переопределить его. Подробнее вы можете прочитать в этих статьях: struts.apache.org/maven/xwork-core/apidocs/com/opensymphony/ и struts.apache.org/maven/xwork-core/apidocs/com/opensymphony/ - person festimk; 11.06.2015
comment
Метод init не вызывает метод intercept. Переопределение метода не достигается с помощью аннотации @Override (это просто маркер). - person Aleksandr M; 11.06.2015

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

Место вызова этого метода: DefaultActionInvocation

public class DefaultActionInvocation extends Object implements ActionInvocation

Реализация ActionInvocation по умолчанию

person Roman C    schedule 07.03.2015
comment
да, но я хочу знать, откуда именно вызывается такое выражение, как «myInteceptor.intercept(ai)». - person jayendra bhatt; 08.03.2015