Java SpringWebFlow中的重定向错误消息

Java SpringWebFlow中的重定向错误消息,java,spring,spring-webflow,spring-webflow-2,Java,Spring,Spring Webflow,Spring Webflow 2,期望值: 当我尝试预订时,由于价格变化和抛出低于价格变化异常,预订失败 然后,我需要捕获事件中的错误,并将请求重定向到上一页,并在页面顶部显示错误消息 根据我下面的逻辑,我可以将请求重定向到上一页,同时抛出价格更改异常,但问题是我不能 在上一页显示我的错误消息(您的预订价格已更改,请选择另一个) 任何人都可以帮我。提前谢谢 BookAction.java public class BookAction { private static final String PRICE_CHANGED

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

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

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

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

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>
<set name="flashScope.flashScopeAttribute" value="'f'" />

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

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


不幸的是,这是SWF的一个缺乏文档记录的部分。您正在寻找的是使用flashScope。flashScope是专门为此而设计的,它是在flashScope中的变量被自动删除后读取的

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

我只能用两种方法来解决它,两种方法都是黑客

选项1。

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

?msg=An Error Occurred.
尽管这在url栏中看起来很难看,但它是最简单、最痛苦的解决方案

选项2。

这有点痛苦,但如果您需要复杂的错误MSG,它提供了最大的灵活性。基本上,您必须合并SpringWebFlow的flashScope和SpringMVC的flashMap,并首先将externalRedirect发送到SpringMVC控制器

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

然后,一旦实现了这一点,就可以使用Spring MVC轻松访问flash变量error msg,如下所示:

注意:该变量已经在SpringMVC的flashMap中。因此,您所要做的就是在SpringMVC中呈现一个视图,并从视图中访问变量


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

事实上SpringWebFlow有许多可以存储变量的作用域,但当一个流结束时,所有作用域也会结束,除非流是子流,否则将控制权委托回父流。在这种情况下,除了任何父流作用域变量外,还可以使用flash作用域

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

参考文档中提到了这一点。

使用闪存示波器:

在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>
<set name="flashScope.flashScopeAttribute" value="'f'" />

我认为在重定向发生后,您将无法读取“flowScope.error”的内容。因为一旦你执行“外部重定向”到另一个页面。。。流结束,因此流镜被擦干净,移除“错误”字符串。是@Airduster。我无法读取该错误消息。你能给出一些替代方案吗?@Mohan请看我提交的答案。我对他们的jira项目提出了改进请求。让我们看看他们怎么说。试试flashscope:请参考