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
相关产品推荐
相关产品推荐

