【问题标题】:FromOutcome for `Switch Node` directing flow to `Method Call Node` don't wont to workFromOutcome for `Switch Node` 将流程引导到 `Method Call Node` 不会起作用
【发布时间】:2014-09-09 13:50:14
【问题描述】:

我将我的流程定义为:

    builder.id("", PublisherBean.PUBLISHER_FLOW_NAME);

    builder.viewNode("list", "/pages/publishers.xhtml");
    builder.viewNode("details", "/pages/publishers-details.xhtml");
    builder.viewNode("deleted", "/pages/publishers-deleted.xhtml");
    builder.viewNode("form", "/pages/publishers-form.xhtml");
    builder.viewNode("exit", "/index.xhtml");

    builder.methodCallNode("invoke-update")
            .expression("#{publisherBean.update()}")
            .defaultOutcome("details");

    builder.methodCallNode("switch-fail")
            .defaultOutcome("invoke-publishers")
            .expression("#{publisherBean.switchFail()}");

    builder.switchNode("proceed-action-request")
            .defaultOutcome("switch-fail")
            .switchCase()
            .condition("#{publisherBean.actionType.ifEdit()}").fromOutcome("form");

    builder.switchNode("go-for-it")
            .defaultOutcome("switch-fail")
            .switchCase()
            .switchCase()
            .condition("#{publisherBean.actionType.ifEdit()}").fromOutcome("invoke-update");

如您所见,有两个切换节点。第一个指向View Node,第二个尝试指向Method Call Node

第一个工作正常,但第二个让我头疼。第二个是给我一个错误

Unable to find matching navigation case with from-view-id '/pages/publishers-form.xhtml' for action '#{publisherBean.proceed()}' with outcome 'proceed-form'.

proceed函数只是

public String proceed() {
        LOG.log(Level.OFF, "Form proceed in action type {0}", actionType);
        return "go-for-it";
    }

记录的信息证实,publisherBean.actionType.ifEdit() 返回 true,但该事实被忽略。如果我将结果从invoke-update 更改为form 或任何其他View Node id,那么它“工作正常”。

是我做错了什么,还是Method Call Node 不能用作Switch Node 的结果?

【问题讨论】:

    标签: jsf-2 flow-scope


    【解决方案1】:

    我也遇到了这个问题。就我而言,问题在于在另一个方法调用节点之后调用方法调用节点。

    我调查了一下,发现有问题:com.sun.faces.application.NavigationHandlerImpl.synthesizeCaseStruct 方法。此方法用于确定从 methodCallNode 或 switchCallNode 到哪里,它只查看 viewNodes 和 returnNodes。

    private CaseStruct synthesizeCaseStruct(FacesContext context, Flow flow, String fromAction, String outcome) {
        CaseStruct result = null;
    
        FlowNode node = flow.getNode(outcome);
        if (null != node) {
            if (node instanceof ViewNode) {
                result = new CaseStruct();
                result.viewId = ((ViewNode)node).getVdlDocumentId();
                result.navCase = new MutableNavigationCase(fromAction, 
                        fromAction, outcome, null, result.viewId, 
                        flow.getDefiningDocumentId(), null, false, false);
            } else if (node instanceof ReturnNode) {
                String fromOutcome = ((ReturnNode)node).getFromOutcome(context);
                FlowHandler flowHandler = context.getApplication().getFlowHandler();
                try {
                    flowHandler.pushReturnMode(context);
                    result = getViewId(context, fromAction, fromOutcome, FlowHandler.NULL_FLOW);
                    // We are in a return node, but no result can be found from that
                    // node.  Show the last displayed viewId from the preceding flow.
                    if (null == result) {
                        Flow precedingFlow = flowHandler.getCurrentFlow(context);
                        if (null != precedingFlow) {
                            String toViewId = flowHandler.getLastDisplayedViewId(context);
                            if (null != toViewId) {
                                result = new CaseStruct();
                                result.viewId = toViewId;
                                result.navCase = new MutableNavigationCase(context.getViewRoot().getViewId(),
                                        fromAction,
                                        outcome,
                                        null,
                                        toViewId,
                                        FlowHandler.NULL_FLOW,                            
                                        null,
                                        false,
                                        false);
    
                            }
                        }
                    } else {
                        result.newFlow = FlowImpl.SYNTHESIZED_RETURN_CASE_FLOW;
                    }
                }
                finally {
                    flowHandler.popReturnMode(context);
                }
    
            }
        } else {
            // See if there is an implicit match within this flow, using outcome
            // to derive a view id within this flow.
            String currentViewId = outcome;
            // If the viewIdToTest needs an extension, take one from the currentViewId.
            String currentExtension;
            int idx = currentViewId.lastIndexOf('.');
            if (idx != -1) {
                currentExtension = currentViewId.substring(idx);
            } else {
                // PENDING, don't hard code XHTML here, look it up from configuration
                currentExtension = ".xhtml";
            }
            String viewIdToTest = "/" + flow.getId() + "/" + outcome + currentExtension;
            ViewHandler viewHandler = Util.getViewHandler(context);
            viewIdToTest = viewHandler.deriveViewId(context, viewIdToTest);
            if (null != viewIdToTest) {
                result = new CaseStruct();
                result.viewId = viewIdToTest;
                result.navCase = new MutableNavigationCase(fromAction, 
                        fromAction, outcome, null, result.viewId, 
                        null, false, false);
            }
    
        }
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多