I have 2 packages - one for interceptor and other for actions. I am extending the interceptor package in my actions package. After running the app, the intercept method of the interceptor is not getting called but directly Logon Action is getting called. I except that before my action the interceptor should be called.
Any idea why it is not happening?
Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<!-- login interceptor -->
<include file="login-interceptor.xml"/>
<!-- Struts Actions -->
<include file="struts2-actions.xml"/>
login-interceptor.xml
<?xml version="1.0" encoding="UTF-8" ?>
<package name="login" namespace="/" extends="struts-default,json-default"\>
<interceptors>
<interceptor name="loginInterceptor" class="com.example.interceptor.LoginInterceptor" />
<interceptor-stack name="loginStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="loginInterceptor" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="loginStack" />
<global-results>
<result name="error">/WEB-INF/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error" />
</global-exception-mappings>
</package>
struts2-actions.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">
<package name="default" namespace="/" extends="login,json-default">
<action name="logon" class="com.example.actions.LogonAction">
<result name="success">
<param name="location">logon.jsp</param>
</result>
</action>
</package>
LoginInterceptor
package com.example.interceptor;
import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;
public class LoginInterceptor implements Interceptor {
/**
* @see com.opensymphony.xwork2.interceptor.Interceptor#destroy()
*/
@Override
public void destroy() {}
/**
* @see com.opensymphony.xwork2.interceptor.Interceptor#init()
*/
@Override
public void init() {}
/**
* @see com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation)
*/
@Override
public String intercept(ActionInvocation objAI) throws Exception {
String result = objAI.invoke();
return result;
}
}
Update
It works when I change the order of the packages in the extends attribute like below:
<package name="default" namespace="/" extends="json-default,login">
or add interceptor package only:
<package name="default" namespace="/" extends="login">
Any idea why it doesn't work when I extend multiple packages and keep my custom package first.