作者:Lala88童鞋_619 | 来源:互联网 | 2022-11-30 13:22
如何解决《java.io.NotSerializableException:Jenkins管道中的sun.net.www.protocol.https.HttpsURLConnectionImpl》经验,为你挑选了1个好方法。
关于它的含义和处理方法的讨论很多,但是使用的主要解决方案@NonCPS
似乎无效。这是相关的代码片段:
@NonCPS
def restCall(String method, String resource, String data = '') {
def URL url = new URL("${Params.REST_BASE_URI}/${resource}")
def HttpURLConnection cOnnection= url.openConnection()
withCredentials([usernamePassword(credentialsId: 'restful-api', passwordVariable: 'RA_PASS', usernameVariable: 'RA_USER')]) {
String encoded = Base64.getEncoder().encodeToString(("${env.RA_USER}:${env.RA_PASS}").getBytes(StandardCharsets.UTF_8))
connection.setRequestProperty("Authorization", "Basic ${encoded}");
}
connection.setRequestProperty("content-type", "application/json");
connection.setRequestMethod(method)
connection.doOutput = true
if (data != '') {
def writer = new OutputStreamWriter(connection.outputStream)
writer.write(data)
writer.flush()
writer.close()
}
connection.connect();
def statusCode = connection.responseCode
if (statusCode != 200 && statusCode != 201) {
throw new Exception(connection.getErrorSteam().text)
}
return connection.content.text
}
注意它确实具有@NonCPS
功能。但是执行此操作仍会产生相同的错误:
an exception which occurred:
in field groovy.lang.Reference.value
in object groovy.lang.Reference@1375b00
in field WorkflowScript$_bitbucketCall_closure1.connection
in object WorkflowScript$_bitbucketCall_closure1@b3001c
in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@144b2a6
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@144b2a6
Caused: java.io.NotSerializableException: sun.net.www.protocol.https.HttpsURLConnectionImpl
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
at ...
我该如何解决?
1> Aleks G..:
事实证明,@NonCPS
实现我的目标不需要注释。相反,我需要做的就是确保在方法调用结束时没有任何不可序列化的变量仍在初始化。因此,以下方法可以正常工作:
def restCall(String method, String resource, String data = '') {
def URL url = new URL("${Params.REST_BASE_URI}/${resource}")
def HttpURLConnection cOnnection= url.openConnection()
withCredentials([usernamePassword(credentialsId: 'restful-api', passwordVariable: 'RA_PASS', usernameVariable: 'RA_USER')]) {
String encoded = Base64.getEncoder().encodeToString(("${env.RA_USER}:${env.RA_PASS}").getBytes(StandardCharsets.UTF_8))
connection.setRequestProperty("Authorization", "Basic ${encoded}");
}
connection.setRequestProperty("content-type", "application/json");
connection.setRequestMethod(method)
connection.doOutput = true
if (data != '') {
def writer = new OutputStreamWriter(connection.outputStream)
writer.write(data)
writer.flush()
writer.close()
}
connection.connect();
def statusCode = connection.responseCode
if (statusCode != 200 && statusCode != 201) {
String text = connection.getErrorStream().text
cOnnection= null
throw new Exception(text)
}
String text = connection.content.text
cOnnection= null
}
技巧是cOnnection= null
在方法执行结束之前显式设置。