En utilisant Java 11, SpringBoot 2, WebFlux, WebClient et Jackson
en essayant d'utiliser Spring WebClient pour consommer un point de terminaison de service Web qui renvoie du XML, type de contenu: 'text/xml;charset=UTF-8'
Dépendance Jackson XML dans le fichier pom.xml du projet:
com.fasterxml.jackson.dataformat
jackson-dataformat-xml
2.9.9
Code WebClient qui déclenche une demande à une API externe et construit la réponse:
WebClient.builder()
.baseUrl(url)
.build()
.get()
.uri(builder.toUriString(), 1L)
.accept(TEXT_XML)
.header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_XML_VALUE)
.acceptCharset(Charset.forName("UTF-8"))
.exchange()
.flatMap(x -> x.bodyToMono(ServiceResponse.class))
.flatMap(x -> buildResponse(x));
Classe ServiceResponse (un simple POJO):
public class ServiceResponse {
private String ack;
private String version;
private String timestamp;
// .. getters and setters
erreur résultante:
org.springframework.web.reactive.function.UnsupportedMediaTypeException: Type de contenu 'text/xml;charset=UTF-8' non pris en charge pour bodyType=com.sample.service.model.ServiceResponse at org.springframework.web.reactive.function.BodyExtractors.lambda$readWithMessageReaders$12(BodyExtractors.java:201) ~[spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE] at java.base/java.util.Optional.orElseGet(Optional.java:369) ~[na:na] at org.springframework.web.reactive.function.BodyExtractors.readWithMessageReaders(BodyExtractors.java:197) ~[spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE] at org.springframework.web.reactive.function.BodyExtractors.lambda$toMono$2(BodyExtractors.java:85) ~[spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE] at org.springframework.web.reactive.function.client.DefaultClientResponse.body(DefaultClientResponse.java:95) ~[spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE] at org.springframework.web.reactive.function.client.DefaultClientResponse.bodyToMono(DefaultClientResponse.java:113) ~[spring-webflux-5.1.8.RELEASE.jar:5.1.8.RELEASE]
comment consommer correctement le type de réponse : Content-type 'text/xml;charset=UTF-8' ?