繁体   English   中英

Java + SOAP:两次执行相同的 SOAP 服务时出现意外的 IndexOutOfBoundsException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM