[英]Java + SOAP: Unexpected IndexOutOfBoundsException when executing the same SOAP service twice
我正在将 Jakarta SOAP API (jakarta.xml.soap) Maven 库与 Java 结合使用。我正在尝试执行相同的 SOAP 服务(让我们将此服务调用到 a218 中的 some418 的 ID a213 行)两次种类。 我正在使用 Mac。
我能够在 SOAP UI 5.5.0 中连续两次执行此操作,但无法在 Java 12 中重现相同的结果:
responseMessage = SOAPConnectionFactory.newInstance().createConnection().call(
MessageFactory.newInstance().createMessage(new MimeHeaders(), someSoapByteStream), targetURL);
这是我提供的 SOAP 正文:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:user="redacted">
<soapenv:Header/>
<soapenv:Body>
<user:getSessionId>
<!--Optional:-->
<userCode>?</userCode>
<!--Optional:-->
<ipAddress>?</ipAddress>
</user:getSessionId>
</soapenv:Body>
</soapenv:Envelope>
我正在调用 POST URL ON some URL https:{redacted}
,并在第一次服务调用时取回:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:getSessionIdResponse xmlns:ns2="redacted">
<sessionId>1caf23db-a04c-11ea-8511-e1c09ad12ebb</sessionId>
</ns2:getSessionIdResponse>
</soap:Body>
</soap:Envelope>
当我尝试使用 Java 在 SOAP 中连续两次执行此服务 A 时,第一次调用成功但第二次调用返回以下异常:
Caused by: com.sun.xml.messaging.saaj.SOAPExceptionImpl:
com.sun.xml.messaging.saaj.SOAPExceptionImpl: Message send failed
at
com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:127)
at utils.plugins.LocalSOAPUtils.callMessage(LocalSOAPUtils.java:115)
... 3 more
Caused by: com.sun.xml.messaging.saaj.SOAPExceptionImpl: Message send failed
at com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:259)
at com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:123)
... 4 more
Caused by: java.lang.IndexOutOfBoundsException: Range [0, 0 + -1) out of bounds for length 1024
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromIndexSize(Preconditions.java:82)
at java.base/jdk.internal.util.Preconditions.checkFromIndexSize(Preconditions.java:343)
at java.base/java.util.Objects.checkFromIndexSize(Objects.java:424)
at java.base/java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:155)
at java.base/sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:78)
at com.sun.xml.messaging.saaj.soap.MessageImpl.writeTo(MessageImpl.java:1396)
at com.sun.xml.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:216)
... 5
使此服务再次成功执行的唯一方法是从头开始运行代码,在这种情况下,第一次调用会再次成功,但第二次不会。
这里可能发生了什么导致这种行为? 是否在 Jakarta SOAP 中设置了一些 static 变量导致第一次调用总是成功但第二次总是失败? 第二次服务调用越界到底是怎么回事?
好吧,原来我是在同一个字节stream上调用上面的方法,这意味着我第二次调用它时,stream的position移动了,因此导致了上面的错误。
我通过简单地初始化一个新的 ByteStream 解决了这个问题:
responseMessage = SOAPConnectionFactory.newInstance().createConnection().call( MessageFactory.newInstance().createMessage(new MimeHeaders(), new ByteArrayInputStream(someSoapByteStreamAsString.getBytes())), targetURL);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.