Author: grobmeier
Date: Mon Jul 15 10:32:37 2013
New Revision: 1503167
URL: http://svn.apache.org/r1503167
Log:
WW-4134: MessageStoreInterceptor java.lang.IllegalStateException if there is no
session
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java?rev=1503167&r1=1503166&r2=1503167&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java
(original)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/MessageStoreInterceptor.java
Mon Jul 15 10:32:37 2013
@@ -39,9 +39,12 @@ import com.opensymphony.xwork2.util.logg
* <!-- START SNIPPET: description -->
*
* An interceptor to store a {@link ValidationAware} action's messages /
errors and field errors into
- * HTTP Session, such that it will be retrieveable at a later stage. This
allows the action's message /
+ * HTTP Session, such that it will be retrievable at a later stage. This
allows the action's message /
* errors and field errors to be available longer that just the particular
HTTP request.
*
+ * If no session exists, nothing will be stored and can be retrieved later. In
other terms,
+ * the application is responsible to open the session.
+ *
* <p/>
*
* In the 'STORE' mode, the interceptor will store the {@link ValidationAware}
action's message / errors
@@ -56,7 +59,7 @@ import com.opensymphony.xwork2.util.logg
*
* In the 'AUTOMATIC' mode, the interceptor will always retrieve the stored
action's message / errors
* and field errors and put them back into the {@link ValidationAware} action,
and after Action execution,
- * if the {@link Result} is an instance of {@link ServletRedirectResult}, the
action's message / errors
+ * if the {@link com.opensymphony.xwork2.Result} is an instance of {@link
ServletRedirectResult}, the action's message / errors
* and field errors into automatically be stored in the HTTP session..
*
* <p/>
@@ -147,7 +150,7 @@ import com.opensymphony.xwork2.util.logg
*/
public class MessageStoreInterceptor extends AbstractInterceptor {
- private static final long serialVersionUID = 4491997514314242420L;
+ private static final long serialVersionUID = 9161650888603380164L;
private static final Logger LOG =
LoggerFactory.getLogger(MessageStoreInterceptor.class);
@@ -219,6 +222,14 @@ public class MessageStoreInterceptor ext
if (action instanceof ValidationAware) {
// retrieve error / message from session
Map session = (Map)
invocation.getInvocationContext().get(ActionContext.SESSION);
+
+ if (session == null) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Session is not open, no errors / messages
could be retrieve for action ["+action+"]");
+ }
+ return;
+ }
+
ValidationAware validationAwareAction = (ValidationAware)
action;
if (LOG.isDebugEnabled()) {
@@ -271,6 +282,13 @@ public class MessageStoreInterceptor ext
// store error / messages into session
Map session = (Map)
invocation.getInvocationContext().get(ActionContext.SESSION);
+ if (session == null) {
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Could not store action ["+action+"]
error/messages into session, because session hasn't been opened yet.");
+ }
+ return;
+ }
+
if (LOG.isDebugEnabled()) {
LOG.debug("store action ["+action+"] error/messages into
session ");
}
Modified:
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java?rev=1503167&r1=1503166&r2=1503167&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
(original)
+++
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/MessageStoreInterceptorTest.java
Mon Jul 15 10:32:37 2013
@@ -113,6 +113,45 @@ public class MessageStoreInterceptorTest
EasyMock.verify(mockActionInvocation);
}
+ public void testIgnoreMessageWithoutSession() throws Exception {
+ MessageStoreInterceptor interceptor = new MessageStoreInterceptor();
+ interceptor.setAllowRequestParameterSwitch(true);
+ interceptor.setOperationMode(MessageStoreInterceptor.STORE_MODE);
+
+ Map paramMap = new LinkedHashMap();
+
+ ActionSupport action = new ActionSupport();
+ action.addActionError("some action error 1");
+ action.addActionMessage("some action message 1");
+ action.addFieldError("field2", "some field error 2");
+
+ ActionContext actionContext = new ActionContext(new HashMap());
+ actionContext.put(ActionContext.PARAMETERS, paramMap);
+
+ // Mock (ActionInvocation)
+ ActionInvocation mockActionInvocation =
EasyMock.createControl().createMock(ActionInvocation.class);
+ mockActionInvocation.getInvocationContext();
+ EasyMock.expectLastCall().andReturn(actionContext);
+ EasyMock.expectLastCall().anyTimes();
+
+ mockActionInvocation.invoke();
+ EasyMock.expectLastCall().andReturn(Action.SUCCESS);
+
+ mockActionInvocation.getAction();
+ EasyMock.expectLastCall().andReturn(action);
+
+ mockActionInvocation.getResult();
+ EasyMock.expectLastCall().andReturn(new ServletActionRedirectResult());
+
+ EasyMock.replay(mockActionInvocation);
+
+ interceptor.init();
+ interceptor.intercept(mockActionInvocation);
+ interceptor.destroy();
+
+ EasyMock.verify(mockActionInvocation);
+ }
+
public void testRetrieveMessage() throws Exception {
MessageStoreInterceptor interceptor = new MessageStoreInterceptor();
interceptor.setOperationMode(MessageStoreInterceptor.RETRIEVE_MODE);