Spring reactive WebClient továbbhívás
2021-06-09T18:04:41+02:00
2021-06-11T02:40:12+02:00
2022-08-12T03:10:30+02:00
Medovarszki
Sziasztok!

Adott egy spring boot projekt, amiben egy REST végpont feladata, hogy ha beesik egy kérés, akkor a kapott paraméterekkel továbbhív egy másik szolgáltatásba, majd az onnan érkező adatokat (JSON, de az adat maga bármi lehet, tehát nem tudok konkrét típusra mappelni) visszaküldi az eredeti hívó félnek egy Fluxon keresztül, tehát kvázi egy proxy.

A megvalósítás tehát kb ennyi:

@GetMapping(value = "/data", produces = MediaType.TEXT_EVENT_STREAM_VALUE) private Flux<String> getData(@RequestParam String sessionid, HttpServletRequest request) { return WebClient.builder() .baseUrl(endpoint) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE) .build() .post() .body(BodyInserters.fromFormData("sessionid", sessionid).with("data_flags", "40")) .retrieve().bodyToFlux(String.class); }}
A másik szolgáltatás egy ezer éve íródott cgi, ami bármilyen üzenetet visszaküldhet bármikor, tehát nem is szakítjuk meg a kapcsolatot (gyakorlatilag SSE).

A problémám az, hogy bizonyos időközönként kapok egy exceptiont, aminek hatására megszakad a kapcsolat:
Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.LinkedHashMap] with preset Content-Type 'text/event-stream']

Megnéztem, a HashMap egyébként ennyi: {timestamp=Wed Jun 09 17:56:41 CEST 2021, status=200, error=OK, message=, path=/user/data}
Nem is értem, miért akarja ezt a CGI-től jövő üzenetet HashMapként parsolni (nekem az is jó lenne, ha ezt eldobja a WebClient).

Egyszerűen nem tudok rájönni, hogyan adok meg olyan convertert, ami megbírkózik a feladattal.

Alapból nem volt config osztályom, tehát default ment minden, de próbálkoztam így is:

@EnableWebMvc @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void extendMessageConverters(List<HttpMessageConverter<?>> messageConverters) { messageConverters.add(new StringHttpMessageConverter()); messageConverters.add(new MappingJackson2HttpMessageConverter()); messageConverters.add(new ByteArrayHttpMessageConverter()); messageConverters.add(new ResourceHttpMessageConverter()); messageConverters.add(new SourceHttpMessageConverter()); messageConverters.add(new GsonHttpMessageConverter()); } }
Ami azt eredményezte, hogy a Flux-os endpoint többé már semmit sem adott vissza, csak eltimeoutolt egy idő után.

Mit csinálok rosszul?
Mutasd a teljes hozzászólást!

abcd