Search code examples
javasessionstruts2struts

SessionAware this.getSession().get("key") always giving null struts2


Using struts2, used SessionAware to keep userObject in session, I find out during the MainAction execution userObject setting properly in session, but while getting userObject in a differnt flow in another action(UploadAction) class every time its returning null. Checked lot of things but no use. I am new to struts and SessionAware, What I am missing here? Put all relevant code down here.

public class WelcomeAction extends MainAction {

private UserObject userObject = new UserObject();
public String executeAction() {

userObject = //DB CALL;
this.getSession().put("user", userObject);
System.out.println("++"+this.getSession().get("user"));
    //giving me UserObject

}
}

public class MainAction extends ActionSupport implements SessionAware{
static Map<String,Object> session;

public MainAction() {       
        
    }



public Map<String,Object> getSession() {
        return session;
    }
    
    @Override
    public void setSession(Map<String,Object> session) {
        BaseAction.session = session;
    }


}


public class UploadAction extends MainAction implements ServletRequestAware{

public String executeAction() {

 UserObject uobj = (UserObject) this.getSession().get("user");// this line always give me null;
 
 //this uobj always null

}

}
struts.xml

    <interceptors>
            <interceptor name="sessionInterceptor"
                class="***.SessionInterceptor"></interceptor>
            <interceptor-stack name="loggingStack">
                <interceptor-ref name="sessionInterceptor" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="loggingStack"></default-interceptor-ref>
        
        
        <action *******.WelcomeAction
            method="executeAction">
            <result name="success" type="redirectAction">*******</result>
        </action>
        
        
        <interceptors>
            <interceptor name="logInterceptor" class="*********LogInterceptor"></interceptor>
            <interceptor name="sessionInterceptor" class="*********.SessionInterceptor"></interceptor>
            <interceptor-stack name="loggingStack">
                <interceptor-ref name="sessionInterceptor" />
                <interceptor-ref name="logInterceptor" />       
                <interceptor-ref name="defaultStack" />             
            </interceptor-stack>
        </interceptors>     
        <default-interceptor-ref name="loggingStack"></default-interceptor-ref>
        
        
        <action name="upload"
            class="*******.UploadAction"
            method="executeAction">
            <interceptor-ref name="Upload">
            </interceptor-ref>                     
            <interceptor-ref name="defaultStack" />
            <result name="success" type="json">
                <param name="noCache">true</param>
                <param name="excludeNullProperties">false</param>
                <param name="contentType">text/html</param>
                <param name="includeProperties">sessionId.*,lstError.*,success.*,message.*</param>
            </result>   
            
            <result name="input" type="json">
                <param name="noCache">true</param>
                <param name="excludeNullProperties">false</param>
                <param name="contentType">text/html</param>
                <param name="includeProperties">success.*,message.*</param>
            
        </action> 

        
        web.xml 
        <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
        </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern></url-pattern>
    </filter-mapping>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    <servlet>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>*******</servlet-name>
        <servlet-class>*******.Process******
        </servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>



SessionInterceptor::
    
    if ( !className.equalsIgnoreCase("WelcomeAction")
              && !className.equalsIgnoreCase("com.opensymphony.xwork2.ActionSupport")
              && ( session == null || session.isEmpty()) ) {
            return "session";
        } else {
            
            return actionInvocation.invoke();
        }

LogInterceptor

Map session = (Map)ActionContext.getContext().get("session");
        UserObject userObject = this.getSession().get("user"));
        if(userObject==null){
            
            return "session";
        }
        else{
            
        }
      
        String result = invocation.invoke();
    

Solution

  • You have used different properties to inject a session object to the action. One is a property of MainAction and another is in BaseAction. When you call this.getSession() then it returns a session from the MainAction but when a session object is injected the property is of BaseAction.

    You should change a setter method to assign a session object to the MainAction when it was injected

    @Override
        public void setSession(Map<String,Object> session) {
            this.session = session;
        }
    

    don't use static properties of the action.


    Also to implement correctly SessionAware you can read this answer:

    To get a SessionMap there's another approach. Let your action class to implement SessionAware and make sure you have configured a default interceptor stack for the action. After that the session map should be injected to the action instance. More about it here.


    Also you have created two interceptor-stack with a name loggingStack one of each override the other.