Реактивные вызовы Spring WebClient - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь понять WebFlux, но у меня возникли проблемы с вызовами Webclient. Я не вижу этой строки System.out.println ("customerId =" + customerId); выполняется, кажется, что он не вызывает конечную точку. Но если я подпишусь на веб-клиента с помощью .subscribe (customer -> {}); тогда я вижу эту строку System.out.println ("customerId =" + customerId); работает на стороне конечной точки. Я не понимаю, почему я должен подписаться на Mono Call, или я должен? Спасибо

@GetMapping("/customer/{customerId}")
@ResponseStatus(HttpStatus.ACCEPTED)
public Mono<Void> getCustomer(@PathVariable("customerId") int customerId) {
     WebClient webClient = WebClient.builder().baseUrl("http://localhost:8080").build();

 webClient.get()
  .uri("/client/customer/{customerId}",customerId)
  .accept(MediaType.APPLICATION_JSON)
  .retrieve()
  .bodyToMono(Customer.class);//here do I have to subscribe to actually activate to call?

 return null;
}


@GET
@Path("/customer/{customerId}")
@Produces(MediaType.APPLICATION_JSON)
public Customer getCustomer(@PathParam("customerId") int customerId) throws InterruptedException {
    System.out.println("customerId = " + customerId);  // I do not see the call comes thru if I dont subscribe to flux call.
    return new Customer(customerId,"custName");
} 

1 Ответ

0 голосов
/ 05 марта 2020

Если вы хотите вернуть реактивный тип из вашего WebClient, вы должны вернуть его из вашего метода контроллера, например:

@GetMapping("/customer/{customerId}")
@ResponseStatus(HttpStatus.ACCEPTED)
public Mono<Customer> getCustomer(@PathVariable("customerId") int customerId) {
     WebClient webClient = WebClient.builder().baseUrl("http://localhost:8080").build();

 return webClient.get()
  .uri("/client/customer/{customerId}",customerId)
  .accept(MediaType.APPLICATION_JSON)
  .retrieve()
  .bodyToMono(Customer.class);
}

Вы также можете вернуть Customer из вашей конечной точки и блока и дождитесь результата вашего WebClient и оставьте реактивную экосистему, например:

@GetMapping("/customer/{customerId}")
@ResponseStatus(HttpStatus.ACCEPTED)
public Customer getCustomer(@PathVariable("customerId") int customerId) {
     WebClient webClient = WebClient.builder().baseUrl("http://localhost:8080").build();

 return webClient.get()
  .uri("/client/customer/{customerId}",customerId)
  .accept(MediaType.APPLICATION_JSON)
  .retrieve()
  .bodyToMono(Customer.class)
  .block()
}

Если вы ищете общее введение в Spring's WebClient, взгляните на это руководство

...