Struts 2 Validation usando o Message Store Interceptor

Eu tenho uma ação em que estou tentando fazer o login do usuário.

public class RegisteredUserAction extends ActionSupport implements SessionAware {
..
..
 public String login() throws Exception {

        DBLogic dBLogic = new DBLogic();
        RegisteredUser user = null;
        try {
            user = dBLogic.getRegisteredUser(getUserUsername(), getUserPassword());
        } catch (CredentialException e) {
            addFieldError("userUsername", e.getMessage());

            addActionError(e.getMessage());
            return INPUT;
        }

        if (user != null) {
            session.put("user", user);
            return SUCCESS;
        }

        return ERROR;
    }
}

Como você pode ver, se o nome de usuário ou a senha for inválida, eu jogo uma CredentialException e preencho essa mensagem de exceção no meu fieldError. Eu até tentei adicionar um erro de ação.

Com alguns conselhos e pesquisas on-line, consegui usar o Message Store Interceptor usando anotações no RegisteredUserAction.action e no MainAction.action, respectivamente, armazenando e buscando.

import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
@InterceptorRefs({
    @InterceptorRef(value = "store", params = {"operationMode", "STORE"}),
    @InterceptorRef("defaultStack"),})

E

import org.apache.struts2.convention.annotation.InterceptorRefs;

@InterceptorRefs({
    @InterceptorRef(value = "store", params = {"operationMode", "RETRIEVE"}),
    @InterceptorRef("defaultStack"),})

Este é o conteúdo do arquivo struts.xml que é relevante:

<package name="pages" extends="struts-default" namespace="/">
        <global-results>
            <result name="displayPage">/WEB-INF/template/page.jsp</result>
            <result name="input">/WEB-INF/template/page.jsp</result>
        </global-results>
        <action name="registrationPage" class="actions.MainAction" 
              method="loadRegistrationPage"></action>
        <action name="loginPage" class="actions.MainAction" 
              method="loadLoginPage"></action>
</package>

<package name="operations" extends="struts-default" namespace="/">

        <action  name="userLogin" class="actions.RegisteredUserAction" method="login">
            <result type="redirect" name="input">loginPage.action</result>
            <result type="redirect" name="success">homePage.action</result>
        </action>
</package>

Eu estou usando uma abordagem baseada em modelo em que o conteúdo do meio (no meu caso o LoginPage.jsp) é incluído na página principal dinamicamente.

Minha página.jsp (que inclui o mainContent):

<s:include value="../%{mainContent}.jsp" ></s:include>

Meu login.jsp (que é incluído):

<%@taglib prefix="s" uri="/struts-tags"%>

<s:form action="userLogin" method="POST">
    <s:textfield name="userUsername" />Error:<s:fielderror name="userUsername" />
    <s:password name="userPassword" />
    <s:submit />
</s:form>

O redirecionamento funciona corretamente e o formulário de login aparece, mas não há erros. Eu até tentei usar o interceptor Message Store no struts.xml sem sorte. :(

questionAnswers(1)

yourAnswerToTheQuestion