Java+;SOAP:执行同一SOAP服务两次时发生意外的IndexOutOfBoundsException
我将JakartaSOAPAPI(Jakarta.xml.SOAP)Maven库与Java结合使用。我试图连续两次执行同一个SOAP服务(让我们称之为服务A),以检索某种会话ID。我用的是Mac电脑 我可以在SOAP UI 5.5.0中连续两次执行此操作,但无法在Java 12中重现相同的结果:Java+;SOAP:执行同一SOAP服务两次时发生意外的IndexOutOfBoundsException,java,xml,web-services,jakarta-ee,soap,Java,Xml,Web Services,Jakarta Ee,Soap,我将JakartaSOAPAPI(Jakarta.xml.SOAP)Maven库与Java结合使用。我试图连续两次执行同一个SOAP服务(让我们称之为服务A),以检索某种会话ID。我用的是Mac电脑 我可以在SOAP UI 5.5.0中连续两次执行此操作,但无法在Java 12中重现相同的结果: responseMessage = SOAPConnectionFactory.newInstance().createConnection().call( MessageFactory.newInst
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>
当我尝试使用Java在SOAP中连续两次执行此服务时,第一次调用成功,但第二次调用返回以下异常:
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
我能够再次成功执行此服务的唯一方法是从一开始就运行代码,在这种情况下,第一次调用将再次成功,但第二次调用将不会成功
这里可能发生了什么导致这种行为?雅加达SOAP中是否设置了一些静态变量,导致第一个调用总是成功,而第二个调用总是失败?第二次服务调用的具体情况是什么?好的,因此我在同一字节流上调用了上述方法,这意味着第二次调用时,流的位置已经移动,因此导致了上述错误 我通过简单地初始化一个新的ByTestStream解决了这个问题:
responseMessage=SOAPConnectionFactory.newInstance().createConnection().call(
MessageFactory.newInstance().createMessage(新的MIMHEADERS(),新的ByteArrayInputStream(SomeSoapByTestStreamAsString.getBytes()),targetURL)代码>好的,结果是我在同一字节流上调用了上述方法,这意味着第二次调用时,流的位置已经移动,因此导致了上述错误
我通过简单地初始化一个新的ByTestStream解决了这个问题:
responseMessage=SOAPConnectionFactory.newInstance().createConnection().call(
MessageFactory.newInstance().createMessage(新的MIMHEADERS(),新的ByteArrayInputStream(SomeSoapByTestStreamAsString.getBytes()),targetURL)代码>您的SomeSoapByTestStream是否可能为空或存在其他问题?你能分享一下你的实现吗?嗨@Taschi,原来soapbytestream确实有问题;也就是说,我第二次叫它时,它的位置已经移动了。我已经在下面相应地回答了我的问题。您的SomeSoapByTestStream是否可能为null,或者是否存在其他问题?你能分享一下你的实现吗?嗨@Taschi,原来soapbytestream确实有问题;也就是说,我第二次叫它时,它的位置已经移动了。我在下面相应地回答了我的问题。
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