在动作调用后在Struts 2拦截器中添加动作消息

时间:2012-11-16 17:53:24

标签: error-handling struts2 struts action interceptor

我在JSON结果中传递操作消息时遇到了一个独特的问题。

现在,如果我在我的操作中添加一个操作消息(在JSON操作中),我将在JavaScript中选择它并捕获操作消息并通过JGrowl提醒用户。但是,我不希望在每个操作中添加操作消息的逻辑。我有一个基础服务项目,其中包含请求之间共享的请求上下文,我可以在那里添加警告消息。我想要做的是将这些警告消息转换为在我的前端使用的操作消息,但操作将永远不必了解它们。这很有用,因为我可以在访问数据库时插入警告,或者如果有繁琐的业务规则等等。

正如我之前提到的,直接在动作中添加它们已经有效,所以我知道JSON结果正常工作并正确传递动作消息。我们每次都有一个拦截器来管理这个请求上下文,所以我想把这个拦截器中的动作消息附加到被调用的动作上。

但是,我发现的问题是我需要先调用actionInvocation.invoke(),因为这会生成任何警告消息。之后,我检查消息并尝试将它们作为操作消息应用。这些操作消息永远不会出现在我的JSON响应中,因此我想知道是否可以在调用invoke()之后将这些消息添加到拦截器中的响应中。这是我拦截方法的主要内容:

    try {           
        // Invoke the action.
        String result = actionInvocation.invoke();

        //add all warning messages as an action message to be displayed on that front end
        if (CollectionUtils.isNotEmpty(context.getWarningMessages())) {

            ActionSupport action = (ActionSupport) actionInvocation.getAction();

            for (String s : context.getWarningMessages()) {
                action.addActionError(s);
            }
        }

        return result;

我尝试添加逻辑以在finally块中添加操作消息,而不是在调用invoke()之后无效。

谢谢, 安迪

1 个答案:

答案 0 :(得分:1)

结果已在时间invoke返回时呈现。

您需要implement a PreResultListener中讨论的"Writing Interceptors" docs