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

Jenkins管道调用APIUrl2时抛出NotSerializableException异常

解决Jenkins Pipeline中的java.io.NotSerializableException: groovy.json.internal.LazyMap错误

问题原因

Jenkins Pipeline为支持流水线持久化(如暂停、恢复),要求脚本中所有使用的对象必须实现Serializable接口。你用的groovy.json.JsonSlurper默认返回groovy.json.internal.LazyMap类型,这个类不支持序列化,流水线尝试序列化该对象时就会抛出异常。

解决方案

有两种可靠修复方式:

1. 用JsonSlurperClassic替代JsonSlurper

JsonSlurperClassic直接返回标准HashMap(已实现Serializable),从根源避免非序列化类型问题。

2. 强制转换解析结果为可序列化类型

若坚持用JsonSlurper,可将解析结果强制转为HashMap或LinkedHashMap,这两种类型都支持序列化。

修改后的代码示例

以下是应用第一种方案的完整代码:

try{ 
    final String response = sh(script: """curl -svf --globoff --request GET --header "Authorization: Bearer ${token}" "$apiUrl" """, returnStdout: true).trim()
    
    // 替换为JsonSlurperClassic,返回可序列化的HashMap
    def jsonSlurper = new groovy.json.JsonSlurperClassic()
    def result = jsonSlurper.parseText(response)
    String testingResponse = result.toString()
    echo testingResponse

    def payload = result.data
    // 确保jobTitles是可序列化的ArrayList
    def jobTitles = []
    for (def jobTitleList in payload) {
        def jobTitleName = jobTitleList.job_title_id.job_title
        jobTitles << jobTitleName
    }
    
    echo "${jobTitles}"
    for (def jobTitleName in jobTitles) {
        String jobTitleString = jobTitleName.toString()
        echo "Job Title : ${jobTitleString}"
        echo apiUrl2
        try {
            echo "Line 87"
            // 修复原命令中https_proxy与curl之间的空格缺失问题
            final String response2 = sh(script: """https_proxy=http://{proxy} curl -svf --globoff --request GET --header "Authorization: Bearer ${token}" "${apiUrl2}" """, returnStdout: true).trim()
            
            echo "Line 91"
            def result2 = jsonSlurper.parseText(response2)
            String testingResponse2 = result2.toString()
            echo testingResponse2
        } catch (Exception e) {
            echo "Error encountered while fetching data"
            echo "Error message: ${e.message}"
        }
            
    }
} catch(e) { 
    echo "${e.message}"
    echo "No PIC"
}

return jobTitles

额外注意点

  • 确保自定义变量(如jobTitles)使用可序列化类型,比如ArrayList而非非标准集合。
  • 原代码中https_proxy=http://{proxy}curl存在空格缺失,会导致curl命令执行失败,已在修改代码中修复。

内容的提问来源于stack exchange,提问作者Irkham 11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:23:34