NiFi ExecuteScript转换JSON时Groovy报StreamCallback无法解析错误
问题根因
- 报错核心原因是代码混用了Nashorn JavaScript引擎的
Java.type()类导入语法,Groovy语言不支持该写法,编译器无法识别StreamCallback类引用,因此抛出无法解析类的编译错误。 - 原代码还存在两处逻辑缺陷:
- 未实现ISO 8601格式时间转Unix时间戳的逻辑,错误尝试读取flowFile默认不存在的
timestamp属性赋值 - 直接调用全局
JSON对象的解析、序列化方法,该对象是JS环境内置对象,Groovy运行环境中不存在,会触发运行时错误
- 未实现ISO 8601格式时间转Unix时间戳的逻辑,错误尝试读取flowFile默认不存在的
修正方案
将ExecuteScript处理器的脚本引擎设置为Groovy,使用Groovy原生语法替换JS风格写法,补全时间转换逻辑,修正后可直接运行的完整代码如下:
import org.apache.commons.io.IOUtils import java.nio.charset.StandardCharsets import java.time.OffsetDateTime import groovy.json.JsonSlurper import groovy.json.JsonOutput def flowFile = session.get() if (flowFile) { flowFile = session.write(flowFile, { inputStream, outputStream -> // 读取输入内容并解析为JSON对象 def inputText = IOUtils.toString(inputStream, StandardCharsets.UTF_8) def contentObj = new JsonSlurper().parseText(inputText) // 解析ISO8601时间转为秒级Unix时间戳 contentObj.time = OffsetDateTime.parse(contentObj.time).toEpochSecond() // 序列化JSON后写入输出流 outputStream.write(JsonOutput.toJson(contentObj).getBytes(StandardCharsets.UTF_8)) } as org.apache.nifi.processor.io.StreamCallback) session.transfer(flowFile, REL_SUCCESS) }
- 代码使用Groovy内置的JSON序列化/解析工具,以及JDK自带的时间API,不需要额外添加第三方依赖
- 转换后输出的time字段值为
1483233295,其余嵌套字段完全保留,和预期输出一致
内容的提问来源于stack exchange,提问作者Neeraj
相关产品推荐
相关产品推荐

