You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NiFi ExecuteScript转换JSON时Groovy报StreamCallback无法解析错误

问题根因
  • 报错核心原因是代码混用了Nashorn JavaScript引擎的Java.type()类导入语法,Groovy语言不支持该写法,编译器无法识别StreamCallback类引用,因此抛出无法解析类的编译错误。
  • 原代码还存在两处逻辑缺陷:
    • 未实现ISO 8601格式时间转Unix时间戳的逻辑,错误尝试读取flowFile默认不存在的timestamp属性赋值
    • 直接调用全局JSON对象的解析、序列化方法,该对象是JS环境内置对象,Groovy运行环境中不存在,会触发运行时错误
修正方案

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:30:48