如何在Camunda 7 DMN中编写自定义脚本并处理REST调用问题
解决DMN单元格空值校验与自定义代码编写问题
问题概述
我正在创建DMN文件,用于依据配料百分比生成饮品评价,计划通过REST POST请求传递JSON格式的配料数据完成评估。需要实现空值校验逻辑(伪代码:if sugar is present in Cola: return ingredient.sugar else return 0),但未添加校验时出现以下报错:
{"type": "RestException","message": "Cannot evaluate decision Food:1:1c8bc453-4d53-11ee-b0ae-12d907201e30: Exception while evaluating decision with key 'null'"}
DMN单元格自定义代码/空值校验实现方案
不同DMN引擎的语法略有差异,以下是主流场景的实现方式:
1. DMN标准FEEL表达式(推荐)
使用FEEL的原生语法即可完成空值校验,无需额外自定义函数:
// 检查属性存在性并返回默认值 if exists(ingredients.Cola.sugar) then ingredients.Cola.sugar else 0 // 简化写法(部分引擎支持空合并运算符) ingredients.Cola.sugar ?? 0
exists()函数用于验证属性是否存在且非空;??运算符会直接返回左侧非空值,否则返回右侧默认值,语法更简洁。
2. 嵌入脚本代码(针对JVM系引擎如Camunda)
如果需要复杂逻辑,可在单元格中嵌入Groovy/Java脚本实现自定义函数:
def getIngredientValue(ingredientsMap, drinkName, ingredientName) { // 安全链式访问避免空指针 return ingredientsMap?.get(drinkName)?.get(ingredientName) ?: 0 } // 调用函数,参数对应REST传入的JSON字段 getIngredientValue(ingredients, "Cola", "sugar")
注意:确保引擎开启脚本支持,且变量名(如ingredients)与REST请求的JSON顶级字段完全匹配。
3. 可视化配置空值处理(无代码方案)
部分DMN编辑器(如Camunda Modeler)支持可视化配置:
- 右键点击目标单元格,选择「空值处理」
- 设置空值时的默认返回值(比如0)
- 适合简单场景,无需编写代码
报错排查要点
你遇到的decision with key 'null'错误,通常和以下问题有关:
- 检查DMN文件中所有决策节点的
Id和Name是否非空且唯一 - 确认REST请求的JSON结构与DMN定义的输入变量结构完全匹配,比如是否存在
ingredients顶级字段 - 开启DMN引擎调试日志,定位具体为空的变量或决策节点
内容的提问来源于stack exchange,提问作者Ehtesham Sajed
相关产品推荐
相关产品推荐

