Как в связке Retrofit+Soap расположить header перед телом body?

Тело запроса который у меня выходит:

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
    <soap12:Body>
        <get_Content xmlns="http://tempuri.org/">
            ...
        </get_Content>
    </soap12:Body>
    <soap12:Header>
        <MyHeader xmlns="http://tempuri.org/">
           ....
        </MyHeader>
    </soap12:Header>
</soap12:Envelope>

Ответ пустой результат:

    <soap:Body>
        <get_ContentResponse xmlns="http://tempuri.org/" />
    </soap:Body>

Тело запроса который работает в postman:

<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Header>
        <MyHeader xmlns="http://tempuri.org/">
           ....
        </MyHeader>
    </soap12:Header>    
    <soap12:Body>
        <get_Content xmlns="http://tempuri.org/">
            ...
        </get_Content>
    </soap12:Body>
    
</soap12:Envelope> 

Ответ с результатом:

        <get_ContentResponse xmlns="http://tempuri.org/">
            <get_ContentResult>....</get_ContentResult>
        </get_ContentResponse>

Класс envelope, вроде позиция правильная:

class ContentRequestEnvelope {
    @set:Element(name = "soap12:Header", required = false)
    @get:Element(name = "soap12:Header", required = false)
    lateinit var header: ContentRequestHeader

    @set:Element(name = "soap12:Body", required = false)
    @get:Element(name = "soap12:Body", required = false)
    lateinit var body: ContentRequestBody
}

Образование envelope:

   val envelope = ContentRequestEnvelope()

   val header = ContentRequestHeader()
   val dataHeader = ContentRequestDataHeader()
   dataHeader.request = "..."
   header.contentRequestHeader = dataHeader
   envelope.header = header

   val body = ContentRequestBody()
   val dataBody = ContentRequestDataBody()
   dataBody.arg = "..."
   envelope.body = body

   val call: Call<ContentResponseEnvelope> = serverApi.requestStateInfo(envelope)

   call.enqueue(object : Callback<ContentResponseEnvelope> {
       override fun onResponse(
          call: Call<ContentResponseEnvelope>,
           response: Response<ContentResponseEnvelope>
       ) {}

       override fun onFailure(
           call: Call<ContentResponseEnvelope>,
            t: Throwable
           ) {}
       })
    }

Я предполагаю, что проблема в позиции тегов. Как это исправить?
Может проблема в другом...?


Ответы (1 шт):

Автор решения: Eugene Krivenja

Проблема описана тут с вариантом решения для SimpleXML framework
https://github.com/square/retrofit/issues/2269

Весь вопрос в правильном написании аннотации @Order, ваш вариант будет что-то типа такого:

@Order(elements = {"soap12:Envelope/soap12:Header", "soap12:Envelope/soap12:Body"})
→ Ссылка