NiFi中Groovy脚本获取FlowFile报空指针异常求助
NiFi Groovy脚本空指针异常解决方法
核心问题分析
从报错信息来看,空指针异常的直接原因是你错误地将session.read()的返回值赋值给了flowFile变量。NiFi的ProcessSession.read()方法是无返回值的(void),执行这个赋值操作后,flowFile会被覆盖为null,后续调用session.write(null, ...)自然会触发空指针异常,这也对应了ExecuteGroovyScript报错中指向ProcessSessionWrap.write的栈信息。
除此之外,还需要确认输入JSON的结构是否与脚本中的字段访问路径匹配,若输入JSON缺少预期的层级(比如values字段不存在),虽然你用了安全导航符?.避免了直接NPE,但可能导致最终生成的输出JSON全为null,也需要排查。
修正后的Groovy脚本
import groovy.json.JsonSlurper import groovy.json.JsonOutput import java.util.logging.Logger Logger logger = Logger.getLogger("") def flowFile = session.get() if (!flowFile) return try { def flowFileContent // 注意:不要将session.read的结果赋值给flowFile,read方法无返回值 session.read(flowFile, { inputStream -> flowFileContent = new JsonSlurper().parse(inputStream) } as InputStreamCallback) // 打印日志确认解析结果,方便排查结构问题 logger.info("解析后的FlowFile内容: ${flowFileContent}") def id = flowFileContent?.identifier ?: "" def x1Data = flowFileContent?.values?.x1?.getAt(0)?.data def x1CodeData = flowFileContent?.values?.x1_code?.getAt(0)?.data def x1NameData = flowFileContent?.values?.x1_name?.getAt(0)?.data def look = [ "id": id, "x1": x1Data, "x1_code": x1CodeData, "x1_name": x1NameData ] def outputJson = JsonOutput.toJson(look) // 直接使用原flowFile对象写入内容,无需重新赋值 session.write(flowFile, { outputStream -> outputStream.write(outputJson.getBytes("UTF-8")) } as OutputStreamCallback) session.transfer(flowFile, success) } catch (Exception e) { logger.severe("处理FlowFile失败: ${e.getMessage()}") // 发生异常时将FlowFile转到失败关系,避免session回滚影响其他流程 session.transfer(flowFile, failure) }
额外排查步骤
- 验证输入JSON结构:检查
GenerateFlowFile生成的JSON是否包含identifier、values.x1[0].data等预期字段,例如正确的结构应该类似:{ "identifier": "123", "values": { "x1": [{"data": "x1_value"}], "x1_code": [{"data": "code_001"}], "x1_name": [{"data": "name_test"}] } } - 启用日志调试:通过NiFi的日志组件查看脚本中打印的
解析后的FlowFile内容,确认JSON是否被正确解析。 - 检查处理器配置:确保
ExecuteGroovyScript处理器的Script Engine选择为Groovy,并且已正确配置成功/失败关系。
内容的提问来源于stack exchange,提问作者dsp
相关产品推荐
相关产品推荐

