Currently Iâm having an issue with new Spring 5 WebClient and I need some help to sort it out. The issue is:
I request some url that returns json response with content type text/html;charset=utf-8.
But unfortunately Iâm still getting an exception: org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type ‘text/html;charset=utf-8’ not supported. So I canât convert response to DTO.
For request I use following code:
Flux<SomeDTO> response = WebClient.create("https://someUrl") .get() .uri("/someUri").accept(MediaType.APPLICATION_JSON) .retrieve() .bodyToFlux(SomeDTO.class); response.subscribe(System.out::println);
Btw, it really doesnât matter which type I point in accept header, always returning text/html. So how could I get my response converted eventually?
Advertisement
Answer
Having a service send JSON with a "text/html"
Content-Type is rather unusual.
There are two ways to deal with this:
- configure the Jackson decoder to decode
"text/html"
content as well; look into theWebClient.builder().exchangeStrategies(ExchangeStrategies)
setup method - change the “Content-Type” response header on the fly
Here’s a proposal for the second solution:
WebClient client = WebClient.builder().filter((request, next) -> next.exchange(request) .map(response -> { MyClientHttpResponseDecorator decorated = new MyClientHttpResponseDecorator(response); return decorated; })).build(); class MyClientHttpResponseDecorator extends ClientHttpResponseDecorator { private final HttpHeaders httpHeaders; public MyClientHttpResponseDecorator(ClientHttpResponse delegate) { super(delegate); this.httpHeaders = new HttpHeaders(this.getDelegate().getHeaders()); // mutate the content-type header when necessary } @Override public HttpHeaders getHeaders() { return this.httpHeaders; } }
Note that you should only use that client in that context (for this host). I’d strongly suggest to try and fix that strange content-type returned by the server, if you can.