почему мой пользовательский перехватчик не работает

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

public class TimeConsumedInterceptor extends AbstractInterceptor
{

/*
 * {@inheritDoc}
 */
@Override
public String intercept(ActionInvocation invocation) throws Exception
{
    long start = System.currentTimeMillis();
    String result = invocation.invoke();
    long end = System.currentTimeMillis();
    System.out.println("time consumed: " + (end - start));
    return result;
}

}

Я определяю новый файл xml: ecs-default.xml (он находится непосредственно в пакете src)

<struts>
<include file="struts-default.xml"></include>
<!-- ecs-default package is abstract -->
<package name="ecs-default" extends="struts-default" abstract="true">
    <interceptors>
        <interceptor name="ecsTimer" class="com.nader.interceptor.TimeConsumedInterceptor"></interceptor>

        <interceptor-stack name="ecsStack">
            <interceptor-ref name="ecsTimer"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </interceptor-stack>
    </interceptors>
           <!-- default stack used for ecs-default package -->
    <default-interceptor-ref name="ecsStack"></default-interceptor-ref>

    <global-results>
        <result name="error">error.jsp</result>
    </global-results>

    <global-exception-mappings>
        <exception-mapping exception="java.lang.Exception" result="error" />
    </global-exception-mappings>

</package>
</struts>

и файл struts.xml:

<struts>
<include file="ecs-default.xml"></include>
  <!-- define two empty package, / and /manager, extends ecs-default package -->
<package name="default" namespace="/" extends="ecs-default">
</package>

<package name="manager" namespace="/manager" extends="ecs-default">
</package>

</struts>

Я отлаживаю код, в классе com.opensymphony.xwork2.DefaultActionInvocation, List<InterceptorMapping> interceptorList = new ArrayList<InterceptorMapping>(proxy.getConfig().getInterceptors());, proxy.getConfig().getInterceptors() возвращаются 18 перехватчиков defaultStack, определенных в struts-default.xml, моего перехватчика ecsTimer в нем нет. так почему? Что-то не так в моей конфигурации? Спасибо.


person hiway    schedule 19.03.2013    source источник


Ответы (1)


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

Кстати, уже есть timer перехватчик, который делает то, что вы хотите.

person Aleksandr M    schedule 19.03.2013
comment
Я использую аннотацию struts, я просто делаю, как вы сказали, @ParentPackage(value = "json-default") @Namespace(value = "/manager") @InterceptorRef(value="ecsStack") public class UserSearchAction extends ActionSupport..., теперь он сообщает об ошибке: невозможно найти класс-перехватчик, на который ссылается ref-имя ecsStack - [неизвестное местоположение]. так как это решить? этот класс перехватчиков точно существует. - person hiway; 19.03.2013
comment
Я решаю это, см. stackoverflow. com/questions/8600148/. Я думаю, что аннотация struts2 сложнее, чем конфигурация xml. Большое спасибо. - person hiway; 19.03.2013