本文描述了自动任务执行过程中因参数为空导致的错误及其排查方法。当工作流中的自动节点执行绑定业务方法时,若传递的参数值为空,将引发异常。解决步骤包括查看错误日志、提取关键报错信息、检查流程实例定义文件、对比流程属性中的流程变量、检查变量赋值情况等。文章还列举了三种可能的异常场景:变量从未被赋值、现场配置错误导致参数值为空、业务方法前后版本参数不兼容。每个场景均附有案例分析和原因总结。
【文章主题】:自动任务执行出错,参数为空
【问题表现】:
工作流中在自动节点执行节点任务绑定的业务方法时发生挂起,报错类似:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【具体的节点名称】执行时出现异常:自动任务【节点任务绑定的具体业务功能(比如:com.kingdee.shr.costbudget.adjustSalaryBillFunction)】的操作【具体的业务操作功能】时发生错误
parameters:{[参数值:null]}
【问题说明】:
该类问题,为自动节点执行业务方法需要的参数中,部分传递的参数值为空,虽然错误堆栈中已经执行到相关的业务代码报错空指针,但实际上可能是由于工作流中自动节点传递过去的参数值为空,导致业务取不到对应的值而发生异常。所以需要先排查流程定义的配置以及传递的参数为何为空,需要先保证工作流方面传参是符合业务方法参数要求的。
【该类问题排查思路】:
1、查看错误日志,是否如上述报错信息内容类似;
2、提取日志中关键的报错信息:【具体传递给业务方法的参数 & 参数值:parameter :null 、 参数值:null】是否有传递的参数存在null值的情况。
3、导出异常的流程实例定义文件,导入BOS工具中,查看该自动节点的具体配置,重点查看任务-入口参数中设置的流程变量,检查是否已经业务要求配置入口参数,记住你这里设置的流程变量[A]等配置;
4、对比流程属性中的流程变量,与你在步骤3中设置的具体变量对象[比如:A],比较其变量[A]是否有值;
5、在步骤3中导出的流程实例定义中,检查变量[A]在流程定义中检查[流程变量引用]中是否有对该变量[A]做过赋值的操作,变量需要先赋值后才能使用;
6、检查变量[A]在流程定义中,配合流程实例实际运行的情况反向推理变量[A]出现异常前的最后一次赋值的地方,检查是否有取值/赋值异常的情况,导致变量[A]最终被重新赋值覆盖为空值。
【该类问题一般有以下3种可能的异常场景】:
场景一:
【设置的变量只被引用了,从来没有被赋值过,即变量当前值为空值,然后直接传递调用了业务方法】
【Scene1-1】
【案例提单1】:R20191216-2131(当前案例) 、R20201110-3239、R20190102-1124、R20190110-2819
该问题为:工作流中自动节点执行业务方法挂起,报错为:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【自动】执行时出现异常:自动任务【卡片业务功能(com.kingdee.eas.fi.fa.manage.faCurCardFunction)】的操作【卡片审核(passAudit)】时发生错误
parameters:{[参数值:null]
[参数值:null]}
Caused by: com.kingdee.bos.BOSException :null
Caused exception message is: null
java.lang.NullPointerException
at com.kingdee.eas.fi.fa.manage.app.FaCurCardControllerBean.setWorkflowServiceState(FaCurCardControllerBean.java:2374)
【分析说明】:经检查为节点传入参数【billID】未赋值导致传入空值,导致业务执行方法时报空指针。
【原因总结】:现场不清楚“变量需要先赋值后才能使用”,导致错误配置使用。
【Scene1-2】
【案例提单1】:R20191031-2745
该问题为:工作流中自动节点调用业务方法挂起,报错为:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【退回重扫】执行时出现异常:自动任务【共享基础服务(com.kingdee.eas.base.wssc.app.WsscCommonFunction)】的操作【退回重扫(rescanImage)】时发生错误
parameters:{[参数值:gZYvpNyAR3SDkHupsO3/ckpE9J8=,参数类型:class com.kingdee.bos.util.BOSUuid]
[参数值:,参数类型:class java.lang.String]
[参数值:,参数类型:class java.lang.String]}
Caused by: com.kingdee.eas.base.wssc.ImageSystemException :未知的影像系统相关异常
java.lang.NullPointerException
at com.kingdee.eas.base.wssc.image.helper.NoticeImageSysHelper_GXHC.rescan(NoticeImageSysHelper_GXHC.java:92)
【分析说明】:
经现场提供的流程配置检查,分析如下:
1.自动节点中,使用的参数2、参数3为空,该些取值与变量【approveResult】有关;
2.approveResult一般是审批对象,在审批节点审批时输出的审批信息;
3.查看流程当前的运行情况,这些赋值的审批节点都没有经过,所以该变量并没有被赋值,所以没有值;
4.在【退回重扫】节点中也只是用了,而没有进行赋值操作,因为没有“被赋值过”,所以变量在使用的时候它也是没有值的;
【原因总结】:业务方法的入口参数中使用了审批对象(approveResult)的子属性,而流程中没有经过审批节点,所以不会输出审批对象,从而导致最终传递给自动节点的入口参数为空。
场景二:
【现场配置使用有误问题,导致设置传递给业务的参数值为空】
【Scene2-1】
【案例提单1】:R20190124-2033(当前案例)、R20201230-2847
该问题为:工作流中自动节点执行业务方法挂起,报错如下:
自动活动【创建影像相关信息】执行时出现异常:自动任务【共享基础服务(com.kingdee.eas.base.wssc.app.WsscCommonFunction)】的操作【单据提交自动创建单据影像映射信息(createBillImageMapInfo)】时发生错误
parameters:{
[参数值:null]
[参数值:null]
[参数值:null]
}
-------------------------------------------------
【分析说明】:自动节点的传入参数为null导致调用业务方法失败,需要检查流程当前经过了哪些节点,该些使用的流程变量又在哪个节点上最后赋值导致其变量值为空。
【原因总结】:变量对象有在流程的其他地方被重新赋值的情况,导致最终该变量值为空。
【Scene2-2】
【案例提单2】:R20190806-2068(当前案例)、R20190801-0549
该问题为流程中自动节点挂起,报错为:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【设置审批中】执行时出现异常:自动任务【shr调薪单功能(com.kingdee.shr.costbudget.adjustSalaryBillFunction)】的操作【设置单据审核中状态(setApproveState)】时发生错误
parameters:{[参数值:null]}
【省略】
Caused exception message is: id is null or length is 0. ''
java.lang.IllegalArgumentException: id is null or length is 0. ''
at com.kingdee.bos.util.BOSUuid.read(BOSUuid.java:142)
【分析说明】:根据提供的资料分析,该自动节点传入参数设置为【单据.id】,但是该单据对象为空,所以导致配置参数【单据.id】取到的结果为空,使传递到业务方法执行时报错。
【问题原因】:使用的单据对象未被赋值,或者选择错了单据对象。
场景三:
【业务方法前后版本的参数不兼容导致的问题。】
【Scene3-1】
【案例提单1】:R20201109-2976(当前案例)、R20201118-0747、R20200818-1404、R20200629-0891、R20200326-3449
该问题为:现场更新了费用报销的补丁后出现的问题,为报销单据流程到设置审批通过状态节点时挂起了,报错如下:
Caused by: com.kingdee.bos.workflow.WfException :
自动活动【设置审批通过状态】执行时出现异常:自动任务【报销单功能(com.kingdee.eas.cp.bc.app.BizAccountFunction)】的操作【设置单据审核通过状态(setPassState)】时发生错误
parameters:{
[参数值:hE9rKd/eRKiGvKjLuS1VAMVwA7w=,参数类型:class com.kingdee.bos.util.BOSUuid]
[参数值:null]}
【省略】
Caused exception message is: 请检查此单据工作流中的配置,审批通过节点--任务--入口参数--参数名称--auditorId(审批人ID)的流程变量配置是否正确!
com.kingdee.eas.cp.bc.BizCollException: 请检查此单据工作流中的配置,审批通过节点--任务--入口参数--参数名称--auditorId(审批人ID)的流程变量配置是否正确!
at com.kingdee.eas.cp.bc.app.ExpenseAccountFacadeControllerBean._setPassStateEvent(ExpenseAccountFacadeControllerBean.java:368)
————————————————————
【分析说明】:根据所提供的流程资料分析,该自动节点参数2设置为流程变量【auditorId】,该流程变量值为空,导致执行业务方法时报此错误,此个校验是业务后面新的代码加的,所以打了费用报销的补丁才会出现这个问题,流程变量【auditorId】只在2个审批节点有过赋值操作,所以如果流程中没有经过这两个节点,则流程变量【auditorId】值会为空,从而导致该问题。
【原因说明】:费用报销模块的审批通过方法,添加了参数2(auditorId审批人ID)的设置,导致之前只设置了一个参数的历史流程在调用业务方法时产生不兼容,导致大批量流程在(打完费用报销补丁后)运行到该些自动节点执行业务方法的校验报错挂起。
推荐阅读