Я использую WebClient для публикации API, но он ничего не возвращает.Я предполагаю, что поток остается открытым и не завершается, поскольку я могу использовать блок, чтобы получить то, что я хочу, но я все еще довольно новичок в WebClient и асинхронных вещах, поэтому я не уверен на 100%.
В частности, у меня есть этот метод:
public Mono<AppDto> applicationPost(AppDto dto){
return webClient.post()
.uri("/api/doStuff")
.contentType(MediaType.APPLICATION_JSON)
.body(MonoConverter.appDtoToMono(dto), String.class)
.exchange()
.flatMap(clientResponse -> clientResponse.bodyToMono(Map.class))
.map(MonoConverter::mapValueToAppDto);
}
Где MonoConverter выполняет какое-то преобразование для отображения значений, поэтому это не имеет значения.Вышеприведенный код возвращает значение 202 Accepted, но не возвращает значение или метод моего mapValueToAppDto.Однако приведенное ниже работает:
public Mono<AppDto> applicationPost(AppDto dto){
Map map = webClient.post()
.uri("/api/doStuff")
.contentType(MediaType.APPLICATION_JSON)
.body(MonoConverter.appDtoToMono(dto), String.class)
.exchange()
.flatMap(clientResponse -> clientResponse.bodyToMono(Map.class))
.block();
return Mono.just(MonoConverter.mapValueToAppDto(map));
}
Я предполагаю, что это работает, так как использует блок, но у меня работает метод get, который работает аналогичным образом:
public Mono<AppDto> applicationGetOne(String appId){
return webClient.get()
.uri("/api/getOne/{0}",appId)
.exchange()
.flatMap(clientResponse -> clientResponse.bodyToMono(Map.class))
.map(MonoConverter::mapValueToAppDto);
}
Я бы предпочел использовать первый фрагмент, так как он не использует блок, и он проще и в том же формате, что и другие мои методы.
Кто-нибудь знает, почему первый не работает, или знает, как мне заставить его работать?