本文讨论了工作流自动任务执行时出现的参数类型不匹配问题,包括问题表现、说明、排查思路及三种异常场景。问题表现为自动节点执行任务时因参数类型不匹配而报错。排查思路包括查看错误日志、对比配置与业务方法参数类型等。异常场景包括流程配置错误、实际参数类型不符合要求、复制节点参数输出重复导致覆盖等。每个场景通过案例详细说明了问题发生的原因和解决方案。
【文章主题】:
工作流自动任务执行出错,参数类型不匹配的情况。
【问题表现】:
工作流中自动节点执行节点任务绑定的业务方法时发生挂起,报错类似:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【具体的节点名称】执行时出现异常:自动任务【绑定的具体业务方法名称(com.kingdee.eas.业务模块路径.app.具体的一个业务Function)】的操作【具体的业务操作名】时发生错误
parameters:{[参数值:【实际传递的参数值】,参数类型:【实际传递的参数类型】]}
java.lang.IllegalArgumentException: argument type mismatch
【问题说明】:
报错【argument type mismatch】为该(自动)节点在流程中实际传入的参数,与节点配置(的业务方法)要求参数的【类型】不符合导致。
【该类问题排查思路】:
1、查看错误日志,是否如上述报错信息内容类似;
2、提取日志中关键的报错信息:【argument type mismatch】、【传递给业务方法的具体参数&参数值:】
3、导出异常的流程实例定义,导入BOS工具中查看该自动节点的具体配置,重点查看任务-入口参数中设置的流程变量,是否与业务方法要求的参数类型相符;
4、对比流程属性中的流程变量,与你在步骤3中设置的具体变量对象[比如:A],比较其值是否与你设置的目标值的参数类型相符;
5、在步骤3中导出的流程实例定义中,检查变量[A]在哪些地方可能存在给该变量赋值的情况,在结合流程图实际走过的节点,反向推理变量[A]出现异常前的最后一次赋值的地方,检查是否有取值/赋值异常的情况。
【该类问题一般有以下3种可能的异常场景】:
场景一:
【流程配置有误,导致最终传递参数类型与目标参数类型不一致】
【Scene1-1】
【案例提单1】:R20200507-2370
该问题为:工作流中自动节点执行业务方法挂起,报错如下:
Caused by: com.kingdee.bos.workflow.WfException : 自动活动【退回】执行时出现异常:自动任务【领料申请单业务功能(com.kingdee.eas.scm.im.inv.MaterialRequestFunction)】的操作【反审核领料申请单(ActionUnAudit)】时发生错误 parameters:{ [参数值:A3oAAAAyvNVj0wED......
【省略】
参数类型:class com.kingdee.eas.base.multiapprove.MultiApproveInfo] } java.lang.IllegalArgumentException: argument type mismatch
-----------------------
【分析说明】:即报错【argument type mismatch】(参数类型不匹配),根据提供的资料分析,原因为审批节点【物资管理科科长审批】中错误将审批对象赋值给了变量【billId】导致变量值异常,最终传递给业务方法时报错参数不匹配。
【原因总结】: (审批节点中输出审批明细将审批id输出给了单据id变量,不小心导致的配置有误)
--现场节点输出参数中错误配置赋值,导致变量存储异常,造成传递的参数异常
【Scene1-2】
【案例提单2】:R20191127-0643
该问题为:工作流中自动节点执行挂起,报错如下:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【审核中】执行时出现异常:自动任务【采购合同编辑功能(com.kingdee.eas.cp.bc.app.ApplyFoPaymentEditUIFunction)】的操作【设置审批中(auditing)】时发生错误
parameters:{[参数值:张彦楠,参数类型:class com.kingdee.eas.base.permission.UserInfo]}
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
【分析说明】:该报错【argument type mismatch】是指参数类型不匹配,自动节点的业务方法要求参数类型为【单据id】,但是当前现场传递的参数为【用户id】,与它(业务方法)需要的类型不匹配,所以报错【argument type mismatch】,经分析根本原因是现场在上一个审批节点中错误将审批人id输出到了变量【billid】中,然后再自动节点中使用了该变量导致。
【原因总结】:业务需要传递单据id,实际传递UserInfo,配置有误
【Scene1-3】
其他提单3:R20190705-0909 没有按业务要求传递用户id,而是传递了用户编码,不理解导致配置有误。
场景二:
【参数初步看符合要求,但实际的参数类型不匹配】
【Scene2-1】
【案例提单1】:R20200517-0569
该问题为:工作流中自动节点调用业务方法报错如下:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【返还预算】执行时出现异常:自动任务【费用报销平台通用业务功能(com.kingdee.eas.cp.bc.app.ExpenseCommonFunction)】的操作【预算返还(returnBudget)】时发生错误
parameters:{[参数值:nVnPPy01SuGYtb9AaLw2kUpE9J8=,参数类型:class java.lang.String]
[参数值:费用报销单,参数类型:class com.kingdee.eas.cp.bc.BizAccountBillInfo]
[参数值:false,参数类型:class java.lang.Boolean]}
java.lang.IllegalArgumentException: argument type mismatch
---------------------------
【分析说明】:报错【argument type mismatch】代表参数类型不匹配,经分析为变量【id】类型与所需的类型不一致导致,即当前传递的【[参数值:nVnPPy01SuGYtb9AaLw2kUpE9J8=,参数类型:class java.lang.String]】,该变量经过客户OA接口后,变量类型变成了String类型,而业务方法要求的参数类型为【BOID (com.kingdee.bos.util.BOSUuid)】,两者类型不一致导致报错,该问题已指导现场采用设置【单据对象.id】的变量方式处理后问题解决。
【原因总结】:参数中要求传递BOID,但是实际传递了字符串(参数类型为String),导致类型不匹配。
【Scene2-2】
【案例提单2】:R20201202-3954:[BOID]类型与[IObjectPK]类型由程序自动做转换处理
该问题为:流程走向异常问题,现场反馈流程应该往直下(分支A)走,但是实际往左下(分支B)走。
【问题前置分析】:经分析流程走向与变量【isAudit】值相关,当前【isAudit】值为[false],所以流程走向判断是正常的。深入分析该变量为自动节点业务方法赋值,原因是该自动节点执行业务方法报错存在报错,导致业务方法最终返回值为【false】,并最终影响了流程的走向,相关的错误日志在workflow.log里,报错如下:
Execute function error!
The detail is activityDefId=0799d12e-010b-1000-e000-154ec0a8128fWFACTDEF;functionName=BudgetCtrlFunction;parameters:{OQEAAAFGBPAV4IT6};statckTrace=------
Caused by: com.kingdee.bos.workflow.WfException :
【省略】
Caused exception message is: argument type mismatch
java.lang.IllegalArgumentException: argument type mismatch
【workflow日志中报错如下】:
2020/12/03 22:32:26 INFO[DefaultApplicationManager.invokeTool(DefaultApplicationManager.java:668)]Datacenter:easuat; ProcessDef:af8fd7bd-8c45-4723-903e-f3bc2c79b90aWFPRCDEF; ActivityDef:4b717204-010b-1000-e000-0a0fc0a81284WFACTDEF; parameters:{
[参数值:OQEAAAFGBPAV4IT6,参数类型:class com.kingdee.bos.dao.ormapping.ObjectUuidPK]
java.lang.IllegalArgumentException: argument type mismatch
————————————————————————————
【分析说明】:经分析,该子流程使用的参数为父流程中业务方法返回,子流程中报错的自动节点要求的参数类型是【BOID (com.kingdee.bos.util.BOSUuid)】,子流程中使用的变量【boId】是通过父流程中传递过来的,即父流程中的自动节点【自动置审批状态】的(二开)业务方法返回的流程变量【BillID】,其真实变量类型为【com.kingdee.bos.dao.IObjectPK】,因这目标类型(BOSUuid)与当前参数实际类型(IObjectPK)的这两种类型不一致,所以导致了子流程自动节点执行时报错【java.lang.IllegalArgumentException: argument type mismatch】。
【原因总结】:流程中经过了自动节点&调用了其中的二开方法,对流程变量的类型进行了转换,导致该变量类型与实际需要的类型不一致。
【Scene2-3】
【类似提单3】:R20200530-0373
【问题简述】:客户是由82升级到85的,业务方法中820需要参数类型为String,但是在850版本中需要参数类型为pk(BOID)类型,两者的参数类型是不一样的,所以导致报错,现场重新配置自动节点的业务方法后正常。
【原因总结】:业务方法在不同版本中的参数类型发生变化而又没有兼容低版本参数类型导致。
场景三:
【复制节点参数重复输出问题使节点参数输出重复,导致变量值被覆盖】:
【Scene3-1】:
【案例提单1】:R20200824-0392(当前案例)、R20200831-1746、R20190107-2022、R20190418-1561
该问题为:工作流中自动节点执行业务方法挂起,报错如下:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【设置审批中状态复制】执行时出现异常:自动任务【报销单功能(com.kingdee.eas.cp.bc.app.BizAccountFunction)】的操作【设置单据审批中状态(setApproveState)】时发生错误
parameters:{
[参数值:Ye3kC4gqSTW8sq+qRfVDD0pE9J8=,参数类型:class com.kingdee.bos.util.BOSUuid]
[参数值:[id: lGoAAAASu0Bj0wED]
【省略】
Caused exception message is: argument type mismatch
java.lang.IllegalArgumentException: argument type mismatch
【分析说明】:报错【argument type mismatch】为节点参数类型不匹配,经查参数2【id: lGoAAAASu0Bj0wED】为审批对象,根据现场问题现象说明(经过审批节点【综合办公室负责人】)变量【auditorId】的值就会异常,以及提供的流程定义文件分析,发现为该审批节点【综合办公室负责人】参数输出异常导致,index7的参数输出覆盖了index6参数的值导致,为复制节点参数重复输出问题导致。
【原因总结】:流程编辑过程中使用了复制节点,之前的补丁版本该功能有问题,导致节点的关联参数在不同复制节点中重复输出,然后导致节点后面输出的参数覆盖了前面的参数,即业务方法参数中需要传入用户id,但当前实际参数2中传入了审批对象,参数重复输出导致审批对象输出覆盖了用户id,最终导致某些参数值出现异常。
推荐阅读