2013-03-19 4 views
2

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

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-файл: Écs-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 определенные ул uts-default.xml, мой перехватчик ecsTimer в нем отсутствует. так почему? Что-то не так в моей конфигурации? Благодарю.

ответ

2

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

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

+0

Я использую распорок аннотацию, я просто, как вы сказали, '@ParentPackage (значение = "JSON-умолчанию") @namespace (значение = "/ менеджер") @InterceptorRef (значение = "ecsStack") общественности класс UserSearchAction расширяет ActionSupport' ..., теперь он сообщает об ошибке: не удалось найти класс перехватчика, на который ссылается ref-name ecsStack - [неизвестное местоположение]. так как его решить? этот класс перехватчиков существует точно. – hiway

+0

Я решаю его, см. Http://stackoverflow.com/questions/8600148/how-to-link-custom-interceptor-using-annotation. Я думаю, что аннотация struts2 сложнее, чем xml-конфигурация. Огромное спасибо. – hiway

Смежные вопросы