【问题标题】:Redirect Error message in spring webflowspring webflow中的重定向错误消息
【发布时间】:2015-10-26 18:30:06
【问题描述】:

预期: 当我尝试预订时,由于价格变化并抛出低于价格变化异常,预订失败。

然后我需要在事件中捕获该错误并将请求重定向到上一页并在页面顶部显示错误消息。

根据我的以下逻辑,我可以将请求重定向到上一页,同时抛出价格变化异常,但问题是我不能 在上一页显示我的错误信息(您的预订价格已更改,请选择其他价格)。

任何人都可以帮助我。提前致谢。

BookAction.java

public class BookAction { 
   private static final String PRICE_CHANGED_ERROR = "Your booking price has been changed, please choose another";

   public Event book(RequestContext context) {
    try {
        // Booking attempt 
        // Consider booking attempt failed and throwing price change exception

    }catch (PriceChangeException priceChangeException) {
            return handlePriceChange(context);
    }
   }

    public Event handlePriceChange(RequestContext context) {

        Errors pageErrors = getPageErrors(context);
        if (true) { // Consider if its true and returning new Event "searchPage"
            pageErrors.reject(PRICE_CHANGED_ERROR);
            return new Event(this, "searchPage");
        }
        return error();
    }

}

booking.xml

<webflow:flow>
    <webflow:action-state id="book"> 
        <webflow:evaluate expression="bookAction.book" />       
        <webflow:transition on="success" to="confirm" />
        <webflow:transition on="error" to="handleFrd" />
        <webflow:transition on="searchPage" to="searchPage" />
    </webflow:action-state>

    <webflow:end-state id="searchPage" view="externalRedirect:#{flowScope.bookState.searchResultURI}" />

</webflow:flow>

【问题讨论】:

标签: java spring spring-webflow spring-webflow-2


【解决方案1】:

很遗憾,这是 SWF 中记录不充分的部分。您正在寻找的是使用 flashScope。 flashScope 是专门为此目的设计的,因为它在 flashScope 中的变量被读取后被自动删除。

但是... SWF 中的设计问题是 flashScope 只能在父流和其中嵌入的子流之间工作。如果您使用“externalRedirect”并尝试使用“flashScope.error”访问错误,它将不会保存您的变量......因为从技术上讲,第一个流程结束并且新流程已经开始。那么如何解决这个问题呢?

我只能用 2 种方法解决它,而且都是 hack。

选项 1。

如果消息很简单,那么在 'externalRedirect:#{flowScope.bookState.searchResultURI}' 中附加一个 HTTP GET 参数,例如

?msg=An Error Occurred.

虽然这在 url 栏中看起来很丑,但它是最简单和最不痛苦的解决方案。

选项 2。

有点痛苦,但如果你想要复杂的错误消息,它提供了最大的灵活性。基本上你必须合并 Spring Web Flow 的 flashScope 和 Spring MVC 的 flashMap 并首先将你的 externalRedirect 发送到 spring mvc 控制器。

您需要创建并注册一个 FlowExecutionListenerAdapter 要合并(破解)flashScope 和 flashMap,请参阅下面的链接以获取分步说明(忽略有关 sessionMap 的内容)

Spring web flow how to add flash attribute when exiting from flow to external redirect

然后,一旦您实现了这一点,您就可以使用 Spring MVC 轻松访问您的 flash 变量错误消息,如下所示:

How to read flash attributes after redirection in Spring MVC 3.1?

注意:这个变量已经在spring mvc的flashMap中了。所以你所要做的就是在 spring mvc 中渲染一个视图并从视图中访问变量。

我的 2 美分:由于这样的限制,我个人已经停止使用 webflow,现在只使用 Spring MVC。我认为 Spring Web 流对于非常简单的用例(流 A -> 流 B -> 流 C)仍然很有用,但是如果您现在正在尝试做一些更复杂的事情或者正在尝试从头开始学习 SWF...我对你的建议是只使用 Spring MVC ......从长远来看,它将为你节省大量时间。我认为他们正在对 SWF (3.0) 进行重大修订,也许所有这些限制都会得到解决

【讨论】:

【解决方案2】:

确实,Spring Web Flow 有许多可以存储变量的范围,但是当流程结束时,所有范围也会结束,除非流程是子流程,将控制权委托给父流程,在这种情况下,您可以使用 flash 范围除了任何父流范围的变量。

Spring Web Flow 也知道如何与 Spring MVC flash scope 交互。因此,当顶级流程结束并且重定向到 Spring MVC 端点时,有一种方法可以指示输出变量应该放在 Spring MVC flash 范围内,这将使它们在重定向后可用。

这在参考文档http://docs.spring.io/autorepo/docs/webflow/current/reference/html/spring-mvc.html#spring-mvc-flash-output中有所提及。

【讨论】:

    【解决方案3】:

    在 booking.xml 中,添加以下更改

    <webflow:transition on="searchPage" to="searchPage">
         <set name="flowScope.error" value="'text u wanna show in next page'" type="string" />
    </webflow:transition
    

    现在在重定向页面中尝试阅读该文本。希望它会工作!

    【讨论】:

    • 我认为在重定向发生后您将无法阅读“flowScope.error”的内容。因为一旦你对另一个页面执行“externalRedirect”......流程结束,因此 flowScope 被擦除干净,删除你的“错误”字符串。
    • 是的@Airduster。我无法阅读该错误消息。您能提供一些替代解决方案吗?
    • @Mohan 查看我提交的答案
    【解决方案4】:

    使用闪光范围:

    在 xml 中

    <set name="flashScope.flashScopeAttribute" value="'f'" />
    

    在 JSP 中

    flash scope: #{flashScopeAttribute}
    

    【讨论】:

      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多