我有一个Grails应用程序,它有两个webflows:
问题:
用户可能会在购买向导中执行多个步骤(通过一个webflow),然后他/她决定他们有一个问题,并尝试与我们联系(也是通过一个webflow)。因此,用户点击我们导航菜单上的“contact-us”链接,但是他们会被带回到他们在购买流程中的最后一步。就我个人而言,我认为这与会话中的“执行”键有关,每个链接都用这个键进行定位。
./联系人_us/索引?执行=e1s1
我想要的解决方案:
我想(在上述情况下),如果用户决定自己从“购买流程”切换到“contact-us流”,那么“购买流程”就会失效/删除,并且用户在“contact-us流”中从零开始。
Grails版本2.2.3 Webflow插件: 2.0.8.1
尝试解决方案
我能想到的最好的解决方案(不做太难看的事情)是创建一个过滤器,当单击链接启动一个新的流并尝试删除另一个流时,这个过滤器可以拦截。但是,在这个示例中,它意外地未能在流存储库(null指针)中找到流。
FlowExecutionLock flowExecutionLock = null;
SessionBindingConversationManager conversationManager = applicationContext.getBean('conversationManager');
DefaultFlowExecutionRepository flowExecutionRepository = applicationContext.getBean("flowExecutionRepository");
try {
String executionKey = params.get("execution");// executionKey is something like 'e1s1'
FlowExecutionKey flowExecutionKey = flowExecutionRepository.parseFlowExecutionKey(executionKey);
flowExecutionLock = flowExecutionRepository.getLock(flowExecutionKey);
flowExecutionLock.lock();
FlowExecution execution = flowExecutionRepository.getFlowExecution(flowExecutionKey);
flowExecutionRepository.removeFlowExecution(execution);
} catch (FlowExecutionRepositoryException e) {
log.warn("Could not find flow in repository with id ${executionKey} " + e.getMessage());
} catch (NullPointerException e) {
log.warn("Could not find flow in repository with id ${executionKey} " + e.getMessage());
} finally {
if (flowExecutionLock != null) {
flowExecutionLock.unlock();
}
}的想法?
有没有人知道我是怎么做到的。会话中的两个流(其中一个是不完整的)之间交换应该是可能的,对吗?我想要一个干净的解决方案,而不是调整自己的流量。
发布于 2013-09-16 19:28:22
我似乎找到了一个解决办法,在g:link标记中(我在这里创建到流的链接),我并不总是习惯于添加操作"index“,就像在Grails中一样,默认情况下它会出现在那里,但是当我添加它时,我似乎能够无缝地在流之间交换。
<g:link absolute="true" controller="contact_us" action="index">我不确定是否将旧流从流存储库中删除。我试着在这两个流之间点击了70-80次,但是日志中似乎没有任何东西出现。如果我有任何问题,我会回来更新答案。
https://stackoverflow.com/questions/18817553
复制相似问题