期望: 当我尝试预订时,由于价格变动而导致预订失败并且价格变动低于价格变动例外。
然后我需要捕获事件中的错误并将请求重定向到上一页并在页面顶部显示错误消息。
根据我的下面的逻辑,我可以将请求重定向到上一页,同时抛出价格变化异常,但问题是我无法做到 在上一页显示我的错误消息(您的预订价格已更改,请选择其他)。
任何人都可以帮助我。提前谢谢。
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>
答案 0 :(得分:1)
确实,Spring Web Flow有许多范围可以存储变量,但是当流程结束所有范围也结束时,除非流程是子流程,将控制委托给父流程,在这种情况下你可以使用flash范围除了任何父流范围变量。
Spring Web Flow也知道如何与Spring MVC flash范围进行交互。因此,当顶级流程结束并且重定向到Spring MVC端点时,有一种方法可以指示输出变量应该放在Spring MVC闪存范围中,这将使它们在重定向后可用。
参考文档http://docs.spring.io/autorepo/docs/webflow/current/reference/html/spring-mvc.html#spring-mvc-flash-output中提到了这一点。
答案 1 :(得分:0)
在booking.xml中,添加以下更改
<webflow:transition on="searchPage" to="searchPage">
<set name="flowScope.error" value="'text u wanna show in next page'" type="string" />
</webflow:transition
现在在重定向的页面中尝试阅读该文本。希望它能奏效!
答案 2 :(得分:0)
不幸的是,这是SWF记录不完整的部分。您正在寻找的是使用flashScope。 flashScope是自动删除后读取flashScope中的变量后专门为此目的而设计的。
但是...... SWF中的设计问题是flashScope只能在Parent流和其中的嵌入式子流之间工作。如果您使用&#34; externalRedirect&#34;它将不会保存您的变量。并尝试使用&#34; flashScope.error&#34; ...来访问错误,因为从技术上讲,第一个流程结束并且新流程已经开始。那么如何解决这个问题呢?
我只能用2种方式来解决它,而且都是黑客攻击。
选项1。
如果消息很简单,那么在'externalRedirect:#{flowScope.bookState.searchResultURI}'
附加一个HTTP GET参数,例如
?msg=An Error Occurred.
尽管在网址栏中看起来很难看,但这是最简单,最难以解决的问题。
选项2。
如果你想要复杂的错误信息,那么会更加痛苦,但却提供了最大的灵活性。基本上你必须合并Spring Web Flow的flashScope和Spring MVC的flashMap,并首先将你的externalRedirect发送到spring mvc控制器。
您需要创建并注册FlowExecutionListenerAdapter 合并(hack)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)进行重大修订,然后可能会解决所有这些限制
答案 3 :(得分:0)
使用闪存范围:
在xml中
<set name="flashScope.flashScopeAttribute" value="'f'" />
在JSP中
flash scope: #{flashScopeAttribute}