Как можно использовать SOAP с веб-клиентом Spring Reactor?

Мне удалось установить SSL-соединение с сервером песочницы и отправить объект как сериализованный объект XML, применив тип содержимого MediaType.APPLICATION_XML. Однако этого недостаточно, так как целевая служба поддерживает только SOAP и ожидает, что сообщение будет должным образом упаковано в конверт.


        final var webClient = WebClient.builder()
                .baseUrl(fmdConfiguration.getSinglePackUrl())
                .clientConnector(connector)
                .exchangeStrategies(exchangeStrategies)
                .filter(logResponseStatus())
                .filter(logRequest())
                .build();

        return webClient
                .method(GET)
                .contentType(MediaType.APPLICATION_XML)
                .body(BodyInserters.fromObject(request))
                .retrieve()
                .bodyToMono(SinglePackPingResponse.class);

Вот ответ от сервиса:

Unable to create envelope from given source because the root element is not named "Envelope"

К сожалению, WebClient не поддерживает медиа-тип application/soap+xml. Когда я пытаюсь использовать его, WebClient выдает следующую ошибку:


org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/soap+xml;charset=UTF-8' not supported for bodyType=eu.nmvs.SinglePackPingRequest
    at org.springframework.web.reactive.function.BodyInserters.unsupportedError(BodyInserters.java:300)

person Andras Hatvani    schedule 18.04.2019    source источник
comment
Можете ли вы опубликовать mcve? Почему мой код не работает? На вопросы, подобные приведенным выше, очень сложно ответить.   -  person Abhijit Sarkar    schedule 25.04.2019
comment
@ Андрас, тебе удалось заставить это работать?   -  person Amos Kosgei    schedule 02.05.2019
comment
@AmosKosgei Нет, я применил подход, описанный в blog.godatadriven.com/jaxws-reactive-client< /а>   -  person Andras Hatvani    schedule 02.05.2019


Ответы (1)


Я использую:

private void acceptedCodecs(ClientCodecConfigurer clientCodecConfigurer) {
    clientCodecConfigurer.customCodecs().encoder(new Jackson2JsonEncoder(new ObjectMapper(), TEXT_XML));
    clientCodecConfigurer.customCodecs().decoder(new Jackson2JsonDecoder(new ObjectMapper(), TEXT_XML));
}

а также:

  webClient = webClientBuilder
                .baseUrl(baseUrL)
                .filter(logRequest())
                .exchangeStrategies(ExchangeStrategies.builder().codecs(this::acceptedCodecs).build()).build();
person Jorge Peinado    schedule 09.02.2020