Spring WebFlux Post Issue - PullRequest
       7

Spring WebFlux Post Issue

0 голосов
/ 03 октября 2018

Я использую 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);
}

Я бы предпочел использовать первый фрагмент, так как он не использует блок, и он проще и в том же формате, что и другие мои методы.

Кто-нибудь знает, почему первый не работает, или знает, как мне заставить его работать?

1 Ответ

0 голосов
/ 04 октября 2018

Я нашел причину, по которой у меня возникла эта проблема.Это действительно было связано с моим контроллером (D'Oh!).Для метода post у меня есть проверка, которая связывает ошибки, поэтому я просто возвращал ResponseEntity без указания типа.Поэтому я добавил типизацию к ResponseEntity, и это решило проблему.

Например:

@PostMapping(value="/post")
public ResponseEntity addThing(@Validated @RequestBody AppDto dto, BindingResult result){
    ...
}

И что это исправило:

@PostMapping(value="/post")
public ResponseEntity<Mono<?>> addThing(@Validated @RequestBody AppDto dto, BindingResult result){
    ...
}

Я предполагаю, чтотак как поначалу типизация не была указана, она не использовала поток, в котором был моно-ответ, и поэтому я никогда не получал ответ, но, объявив тип, Spring знает, как использовать моно, таким образом позволяя завершить его.

...