Alfresco workflow API传递reviewers组变量启动工作流后为null问题排查
问题根因可能有以下几类
- 自定义工作流模型缺失对应属性定义:带
mywf前缀的自定义工作流变量必须提前在Alfresco内容模型中注册,如果mywf:reviewersAssignees没有在模型中声明,或者类型配置和传入的reviewersProp不匹配(比如模型定义为单值但你传入数组,或者类型不是d:noderef),变量会被静默丢弃,进入流程后变为null。 - JS参数对象使用不规范:你当前使用
new Array()声明wfparams,属于用索引数组存储字符串键值的非标准用法,Alfresco内置的Rhino JS引擎将JS对象转换为Java Map时,可能出现部分键值解析失败丢失的问题,是常见的触发原因。 - 变量被流程逻辑覆盖:如果存在全局工作流拦截器、流程启动前的校验逻辑,或者流程内部有对该变量的赋值操作,可能将传入的值覆盖为null。
- 类型转换失败:如果
reviewersProp传入的类型不符合要求(比如传入的是组名字符串而非NodeRef/ScriptNode对象,或者数组内元素类型异常),Alfresco在参数转换阶段会将异常值设为null。
补充提问答复:该问题确实有可能是JS对象转换异常导致的,你当前使用Array对象存储字符串键的参数属于非标准用法,是转换异常的高触发场景。
排查方案
- 核对自定义内容模型配置:检查你自定义的mywf模型中
mywf:reviewersAssignees的配置,确保和其他正常传值的变量(如mywf:coAuthorsAssignees)配置完全一致,示例正确配置如下:
<property name="mywf:reviewersAssignees"> <type>d:noderef</type> <multiple>true</multiple> </property>
- 修正wfparams声明方式:将
var wfparams = new Array();替换为var wfparams = {};,使用标准JS对象存储键值参数,避免非标准用法导致的解析异常。 - 补全参数校验日志:在启动工作流的JS中增加日志,确认传入参数的类型和值合法:
logger.info("reviewersProp类型:" + typeof reviewersProp); logger.info("reviewersProp是否为数组:" + Array.isArray(reviewersProp)); logger.info("reviewersProp取值:" + reviewersProp); // 遍历打印所有wfparams参数,确认键值存在 for(var k in wfparams) { logger.info("wfparams[" + k + "] = " + wfparams[k]); }
- 开启工作流调试日志:修改Alfresco的log4j配置,增加如下配置打印工作流全链路日志,确认参数在传入工作流引擎时是否丢失:
log4j.logger.org.alfresco.repo.workflow=DEBUG
日志中会打印startWorkflow方法接收到的所有参数,可直接确认mywf:reviewersAssignees是否在传入Java层时就已丢失。
底层调试方法
可以通过远程调试Alfresco JVM的方式跟踪startWorkflow的执行逻辑:
- 启动Alfresco时增加JVM远程调试参数:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000 - 在IDE中关联Alfresco源码,在以下类的对应方法打断点:
org.alfresco.repo.workflow.WorkflowServiceImpl#startWorkflow:查看JS层传入的参数转换为Java Map后的取值org.alfresco.repo.workflow.activiti.ActivitiWorkflowEngine#startWorkflow:查看参数传入Activiti引擎前的处理逻辑,确认是否有变量过滤、类型转换异常
- 断点跟踪可直接定位到变量被设为null的具体环节。
内容的提问来源于stack exchange,提问作者Fjordo
相关产品推荐
相关产品推荐

