【问题标题】:Activiti bpmn - missing variable comparision to falseActiviti bpmn - 缺少与 false 的变量比较
【发布时间】:2016-10-17 09:43:28
【问题描述】:

在我的 BPMN 文件中,我有一个 gateway 定义如下:

<exclusiveGateway id="gateway" name="An gateway"/>

<sequenceFlow id="sequence1" sourceRef="gateway"
        targetRef="task1">
    <conditionExpression xsi:type="tFormalExpression">${variableABC == true}
    </conditionExpression>
</sequenceFlow>

<sequenceFlow id="sequence2" sourceRef="gateway"
        targetRef="task2">
        <conditionExpression xsi:type="tFormalExpression">${variableABC == false}
    </conditionExpression>
</sequenceFlow>

我想知道当变量variableABC 丢失(未在工作流引擎中设置)时会发生什么?

从我的测试看来,流程将转到第二个分支。谁能解释一下原因?

在 Java 中,null == false 会抛出异常 (?)。在这种情况下activiti引擎是如何工作的?谢谢

【问题讨论】:

    标签: activiti bpmn


    【解决方案1】:

    当然,如果没有提供值,它会转到第二条路径默认boolean 始终为false。这是一个常见的java逻辑。对于 String,如果没有提供默认路径,则 null 表达式的值,Activiti 将抛出异常说 - 在网关之后找不到路径/默认值。

    【讨论】:

    • 除非有已定义的流程/执行变量、spring bean 或 java 委托解析为 variableABC,否则您会从 activiti (JUEL) 获得异常。
    • @AlexanderAnikin 用户询问他是否没有明确设置流程变量。请在判断之前彻底了解问题。
    • 如果他没有设置流程变量,他会得到 org.activiti.engine.ActivitiException: Unknown property used in expression: ${variableABC == true} 如果他得到别的东西,还有更多故事 - 变量在开始地图中设置或在之前定义
    • @AlexanderAnikin -set the process variable 我们正在设置流程变量的value,而不是创建流程变量。如果他不提供流程变量,肯定会抛出 ActivitiException :)
    【解决方案2】:

    我尝试部署与上述类似的工作流程,但无法部署。它给了我一个错误

    org.activiti.engine.ActivitiException:表达式中使用的未知属性:${variableABC == true}

    然后我把它改成

    [CDATA[${execution.getVariable('variableABC') == true}]]

    [CDATA[${execution.getVariable('variableABC') == false}]]

    [CDATA[${execution.getVariable('variableABC') == null}]]

    在此之后,我能够部署它并成功运行我的测试。

    观察:

    1. 当我有超过 3 个序列流时,它从未进入“错误”序列流
    2. 当我删除最后一个序列流,即检查空值时,我得到了错误 org.activiti.engine.ActivitiException:无法选择独占网关“exclusivegateway1”的传出序列流继续处理

    所以我认为activiti没有问题。您只需正确验证您的工作流程。

    :)

    【讨论】:

    • 也可以参考Exclusive Gateways
    • 无论你给出什么答案,我都用正确的错误信息解释过。
    • 如果您根本没有定义任何表达式,您将得到部署错误,但不幸的是,您仍然可以使用引用未定义变量的表达式来部署流程。这是进程执行时发生的运行时错误。
    • @SachinMesare 为什么要在您已经知道逻辑时尝试;)。而且你只是把我想的答案复杂化了。
    • 我认为最好提供发生的确切错误。运行测试用例对我来说只需几分钟的工作,因为我已经完成了所有设置,因为我正在处理它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多