Как отключить клиент cxf SOAP, используя многочастный запрос - PullRequest
1 голос
/ 17 апреля 2020

Мне нужно позвонить в частную службу, которая не поддерживает многокомпонентные запросы, я не отправляю никаких вложений, но, похоже, cxf создает многокомпонентный запрос

POST /endpoint HTTP/1.1
Content-Type: multipart/related; type="text/xml"; boundary="uuid:86ebef4f-fc2a-431b-a21b-37e86b4901f9"; start="<root.message@cxf.apache.org>"; start-info="text/xml"
Accept: */*
Authorization: Basic U1dHMTAwNTA6MTIzNDU1
SOAPAction: "XYZ.0050"
User-Agent: Apache-CXF/3.3.6
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:8082
Connection: keep-alive
Content-Length: 2134


--uuid:86ebef4f-fc2a-431b-a21b-37e86b4901f9
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
[etc...]

Я заметил не многокомпонентный запрос отлично работает

POST /endpoint HTTP/1.1
Content-Type: text/xml;charset=UTF-8
Accept: */*
Authorization: Basic U1dHMTAwNTA6MTIzNDU1
Cache-Control: no-cache
Connection: keep-alive
Host: localhost:8082
Pragma: no-cache
SOAPAction: "XYZ.0050"
User-Agent: Apache-CXF/3.3.6
Content-Length: 2114

[etc...]

Как заставить cxf использовать не множественный запрос?

1 Ответ

0 голосов
/ 17 апреля 2020

похоже, что cxf создает multipart каждый раз, когда есть атрибут @XmlAttachmentRef / DataHandler, в моем случае он никогда не используется, поэтому я удалил его из своих классов.

лучшее решение было бы удалить SwAOutInterceptor из цепочки перехватчиков, определив съемник-перехватчик

class InterceptorRemover : AbstractSoapInterceptor(Phase.PRE_LOGICAL) {
    init {
        addBefore(SwAOutInterceptor::class.java.name)
    }
    override fun handleMessage(message: SoapMessage?) {
        if (message != null) {
            val res = message.interceptorChain.firstOrNull() { it is SwAOutInterceptor }
            if (res != null) {
                message.interceptorChain.remove(res)
            }
        }
    }
}

и добавить его в цепочку:

val client = ClientProxy.getClient(port)
client.outInterceptors.add(InterceptorRemover())
...