Struts 2消息存储拦截器删除无重定向错误

时间:2013-10-29 00:48:24

标签: java jsp struts2

Struts 2中的消息存储拦截器出现问题。我的struts.xml文件中有以下操作:

<action name="rfi" method="add" class="org.test.action.RfiAction">
    <interceptor-ref name="store">
        <param name="operationMode">AUTOMATIC</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack" />
    <result name="error">../display/irrt/rfi.jsp</result>
    <result name="input">../display/irrt/rfi.jsp</result>
    <result name="success" type="redirectAction">
        <param name="actionName">rfis</param>
        <param name="namespace">/irrt</param>
    </result>
</action>

当动作成功返回时,它会重定向到列出的动作,并且拦截器会正确保存和检索成功消息。

但是,当发生错误时,没有重定向,它会进入列出的JSP页面,但错误不会显示(所有其他数据都会出现)。这就像MessageStoreInterceptor在运行时清除错误变量的内容,这样如果没有重定向,则当前操作不再有错误消息。

当拦截器设置为STORE或AUTOMATIC模式时会发生这种情况(即使拦截器在AUTOMATIC模式下不应该运行,结果也不包含重定向)。

我的代码只会添加错误或消息。它永远不会删除它们。行动代码如下:

private String add()
{
    try
    {
        // add the rfi entry
        this.rfiService.addRfi(this.rfiEntry, this.getLoggedInUser());
    }
    catch(ConnectionException e)
    {
        this.addActionError("Could not add RFI entry.");
        e.printStackTrace();

        return ERROR;
    }

    // set success message
    this.addActionMessage("RFI entry added.");

    return SUCCESS;
}

这是JSP中用于显示消息的代码:

<s:if test="hasActionErrors() == true">
    <s:iterator value="actionErrors">
        <p class="text"><b><font color="red"><s:property /></font></b></p>
    </s:iterator>
</s:if>
<s:elseif test="hasActionMessages() == true">
    <s:iterator value="actionMessages">
        <p class="text"><b><font color="green"><s:property /></font></b></p>
    </s:iterator>
</s:elseif>

非常感谢任何有关此问题的帮助。

2 个答案:

答案 0 :(得分:0)

<result name="success" type="redirectAction">
        <param name="actionName">rfis</param>
        <param name="namespace">/irrt</param>
    </result>

redirectAction rfis也应该通过store拦截器。

<action name="rfis" class="..." method="...">
    <interceptor-ref name="store">
        <param name="operationMode">AUTOMATIC</param>
    </interceptor-ref>
    <interceptor-ref name="defaultStack" />
    <result ..../>
</action>

答案 1 :(得分:0)

我错过了包含错误的此特定页面上的包含内容。

故事的道德:不要假设每个其他页面上的代码都在那个不起作用的代码上。