Java + SOAP: неожиданное исключение IndexOutOfBoundsException при выполнении одной и той же службы SOAP дважды - PullRequest
1 голос
/ 27 мая 2020

Я использую Jakarta SOAP API (jakarta. xml. soap) библиотеку Maven вместе с Java. Я пытаюсь выполнить одну и ту же службу SOAP (назовем ее A) дважды подряд, чтобы получить какой-либо идентификатор сеанса. Я использую Ma c.

Я могу выполнить эту операцию дважды подряд в 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>

Я вызываю URL-адрес POST для некоторого URL-адреса https:{redacted} и получаю его обратно в первой службе call:

<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>

Когда я пытаюсь выполнить эту службу A дважды подряд в SOAP с использованием Java, первый вызов успешен, но второй возвращает следующее исключение:

    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

Единственный способ заставить эту службу снова успешно работать - запустить код с самого начала, и в этом случае первый вызов снова будет успешным, а второй - нет.

Что могло возможно, здесь происходит такое поведение? Существуют ли какие-то переменные stati c, установленные в Jakarta SOAP, из-за которых первый вызов всегда выполняется успешно, а второй всегда терпит неудачу? Что именно насчет второго обращения в службу поддержки?

1 Ответ

0 голосов
/ 28 мая 2020

Хорошо, получается, что я вызывал вышеуказанный метод в том же потоке байтов, что означало, что во второй раз, когда я его вызвал, позиция потока сместилась, что вызвало указанную выше ошибку.

Я исправил проблему, просто инициализировав новый ByteStream:

responseMessage = SOAPConnectionFactory.newInstance().createConnection().call( MessageFactory.newInstance().createMessage(new MimeHeaders(), new ByteArrayInputStream(someSoapByteStreamAsString.getBytes())), targetURL);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...