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();
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 implementSessionAware
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.